Maven学习02 - 生命周期、集成和聚合
)
Maven学习02 - 生命周期、集成和聚合
1.Maven生命周期
什么是生命周期
Maven 强⼤的原因是有⼀个⼗分完善的⽣命周期,⽣命周期可以理解为项⽬构建步骤的集合,它定义了各个构建环节的执⾏顺序,有了这个顺序,Maven 就可以⾃动化的执⾏构建命令。
Maven 的核⼼程序中定义了抽象的⽣命周期,⽣命周期中各个阶段的具体任务是由插件来完成的。有三套相互独⽴的⽣命周期,各个构建环节执⾏顺序不能打乱,必须按照既定的正确顺序来执⾏。
- Clean Lifecycle : 在进⾏真正的构建之前进⾏⼀些清理⼯作
- Default Lifecycle:构建的核⼼部分,编译、测试、打包、安装、部署等等。
- Site Lifecycle:⽣成项⽬报告,站点,发布站点。
这三个都是相互独⽴的。你可以仅仅调⽤ clean 来清理⼯作⽬录,仅仅调⽤ site 来⽣成站点。当然,也可以直接运⾏ mvn claen install site 运⾏所有这三套⽣命周期。
Clean Lifecycle
pre-clean 执⾏⼀些需要在clean之前完成的⼯作
clean 移除所有上⼀次构建⽣成的⽂件
post-clean 执⾏⼀些需要在clean之后⽴刻完成的⼯作
我们前⾯讲的执⾏命令 mvn -clean,也就等同于 Clean ⽣命周期中的第⼀个阶段 mvn pre-clean clean。注意有 Clean 声明周期,⽽这个声明周期中⼜有 clean 阶段。
只要执⾏后⾯的命令,那么前⾯的命令都会执⾏,不需要再重新去输⼊命令
Default Lifecycle
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源⽂件,⾄⽬标⽬录,准备打包。
compile 编译项⽬的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源⽂件,⾄⽬标测试⽬录。
test-compile 编译测试源代码。
process-test-classes
test 使⽤合适的单元测试框架运⾏测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装⾄本地仓库,以让其它项⽬依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发⼈员与项⽬共享。
在maven中,只要在同⼀个⽣命周期,你执⾏后⾯的阶段,那么前⾯的阶段也会被执⾏,⽽且不需要额外去输⼊前⾯的阶段。
2.Maven继承和聚合
继承
有三个 Maven ⼯程,每个⼯程都依赖某个 jar 包,⽐如 Junit,由于 test 范围的依赖不能传递,它必然会分散在每个⼯程中,⽽且每个⼯程的jar 包版本可能不⼀致。那么如何管理各个⼯程中对于某个 jar 包的版本呢?
解决办法:
将那个 jar 包版本统⼀提取到 ⽗ ⼯程中,在⼦⼯程中声明依赖时不指定版本,以⽗⼯程中统⼀设定的为准,同时也便于修改。
操作步骤:
-
创建父工程
-
在子工程中声明对父工程的引用
<!--⼦⼯程中声明对⽗⼯程的引⽤ --> <parent> <groupId>com.seafyliang.maven</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 以当前⼯程⽂件为基准的⽗⼯程 pom.xml⽂件的相对路径(可以不配置) --> <relativePath>../Parent/pom.xml</relativePath> </parent>
-
将⼦⼯程的坐标中与⽗⼯程坐标重复的内容删除(不删除也可以,为了简洁)
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
dependencyManagement标签管理的依赖,其实没有真正依赖,它只是管理依赖的版本。
-
在⼦⼯程中删除 Junit 的版本号
-
更改版本号,(我们只需要更改⽗⼯程中的版本号即可)⽗⼯程通过 properties 统⼀管理版本号
我们可以通过 ⾃定义标签,然后在标签⾥⾯填写常量,这种⽅法不仅可以⽤来管理版本号,还可以⽤来管理⽐如设置某种编码等等。
聚合
需求场景:
在真实项⽬中,⼀个项⽬有表现层、业务层、持久层等。我们在⽤Maven 管理项⽬的时候,通常为创建多个 Maven ⼯程,也就是⼀个项⽬的多个模块。但是这样分成多个模块了,当我们进⾏项⽬打包发布的时候,那么要每⼀个模块都执⾏打包操作吗?这种重复的操作我们怎么才能避免呢?
解决办法:
创建⼀个聚合⼯程,将其他的各个模块都由这个聚合⼯程来管理,那么我们在进⾏项⽬发布的时候,只需要打包这个聚合⼯程就可以了。
操作步骤:
-
创建聚合⼯程(注意聚合⼯程的打包⽅式也必须为 pom,通常由 上⾯所讲的⽗⼯程来充当聚合⼯程)
- 创建的工程是 Maven Project,和创建子工程有区别
- 打包方式(Packaging)为pom
-
创建⼦⼯程:业务层
- 选择 Maven Module
- 填写⼦⼯程模块名(Module Name),打包⽅式选择 jar(⼦⼯程除了 web 层我们打包⽅式选择 war ,其余的都选择jar)
-
创建⼦⼯程:表现层和持久层
- 创建步骤和前⾯⼀样,注意表现层打包⽅式我们要选择 war,因为要发布到 tomcat 容器运⾏。
-
第四步:在聚合⼯程中添加⼦⼯程的引⽤
<modules> <module>Service</module> <module>Controller</module> <module>Mapper</module> </modules>
注意:这⾥虽然各个模块有依赖关系,但是 可以不让依赖顺序添加,maven会⾃动识别依赖关系进⾏编译打包。
这⾥总的聚合⼯程随便哪个⼯程都可以,但是通常⽤ Parent ⼯程来完成。