Maven进阶使用
1.Maven基础知识简介
- 仓库分类
- 本地仓库
- 远程仓库(私服)
- 中央仓库
- Maven的优点:统一管理jar包,集成tomcat插件,一键构建。
- Maven的生命周期
- 清理生命周期
- 默认生命周期
- 站点生命周期
- 项目的启动流程,第一步永远是先去本地仓库找jar包。
2. Jar包冲突的解决方式
- 第一声明原则:声明靠上的优先进入项目
- 路径近者优选原则:
- 直接依赖:直接导入的jar包
- 传递依赖:没有直接导入的jar包,可通过项目依赖jar包传递到项目中
- 排除jar包依赖包:使用exclusion标签排除依赖项目里面的jar包,不用加版本号(直接排除法)
3.pom文件标签
- dependencyManagement:锁定jar包版本,在被依赖的项目中写
- properties:统一管理jar包版本
- exclusion:从依赖构件列表里,列出被排除的依赖构件
4.Maven工程拆分和聚合的思想
普通项目分三层:DAO、SERVICE、Controller
maven解决代码可重用和便于维护问题上是这么解决的:
maven把一个完整的项目,分成不同的独立模块,这些模块都有各自独立的坐标。哪些地方需要其中的模块,就直接引入该模块的坐标即可。
我们开发一个新项目,先考虑的问题不是dao,service,utils,domain如何编写,我们要考虑的是,上述模块是否已存在,如果存在直接引用。这就是maven拆分的思想。
我们可以把拆分零散的模块聚合到一起编写一个完整的项目,这就是maven聚合的思想。
何为继承:继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml 文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的 配置提取出来在父工程的pom.xml 中定义。
何为聚合:项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在 一起运行,比 如:dao、service、web 三个工程最终会打一个独立的 war 运行。
5.工程和模块的区别
工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,代码完整就是一个完整的项目,和此项目是工程和模块没有关系。
工程天生只能使用自己的资源,工程天生是独立的。后天可以和其他工程或模块建立关联关系。
模块天生不是独立的,子模块天生继承父模块,可以使用父模块的所有公共资源。子模块之间天生没有任何联系。
父子工程直接不用建立关系,继承关系是天生的,不需要手动建立。
平级直接的调用叫做依赖,依赖不是天生的,依赖是需要后天建立的。
6.传递依赖下来的包是否能用
直接依赖\传递依赖 | compile | provided | runtime | test |
---|---|---|---|---|
compile | compile | -(传递丢失) | runtime | - |
provided | provided | provided | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
实际开发中,如果传递依赖丢失,表现形式就是jar包的坐标无法导入,我们的做法就是直接再导入一次。
7.从私服下载依赖的配置
<!-- 下载jar包配置 -->
<profile>
<!--profile的id -->
<id>dev</id>
<repositories>
<repository>
<!--仓库id,repositories可以配置多个仓库,保证id不重复 -->
<id>nexus</id>
<!--仓库地址,即nexus仓库组的地址 -->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<!--是否下载releases构件 -->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载snapshots构件 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>