发表于: 2017-08-24 21:42:14

1 1108


一、今日完成

学习Maven的聚合与继承功能,主讲Java小课堂;

1.背景介绍

POM(Project Object model 项目对象模型),是Maven项目的核心,定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。POM可以与实际的Java代码相独立,实现解耦或者正交性。

2.知识剖析

实际应用中,一个项目往往是由多个 project 构成的,在进行构建(build)时,针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。

父模块不需要有源代码和资源文件,即没有 src/main/java 和 src/test/java 目录。Maven首先解析父模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算一个反应堆构建顺序(Reactor Build Order ), 根据这个顺序依次构建模块。将各子模块聚合到父模块中后,就可以对父模块进行一次构建命令来完成全部模块的构建。反应堆(Reactor)是所有模块组成的一个构建结果。

3.常见问题

1.执行mvn clean install,输出提示compilation failure。

4.解决方案

 由于compiler插件默认支持的java版本较低,需要对其进行配置,向pom.xml加入相关<plugin>元素。

5.代码实战

父模块的POM元素配置(部分):

<!--定义了一组Maven坐标,父模块并不是像之前项目那样创建一个JAR或者WAR
仅仅是一个关联到其他项目的POM,注意<packaging>元素的声明内容-->
<parent>
<groupId>org.sonatype.mavenbook.multi</groupId>
<artifactId>parent</artifactId>
<version>0.8-SNAPSHOT</version>
</parent>
<artifactId>simple-parent</artifactId>
<packaging>pom</packaging>
<name>Multi Chapter Simple Parent Project</name>

<!--声明本项目的子模块-->
<!--These modules are defined in the modules element, and each module element
corresponds to a subdirectory of the simple-parent directory. Maven knows to look
in these directories for pom.xml files, and it will add submodules to the list of Maven
projects included in a build.-->
<modules>
<module>simple-weather</module>
<module>simple-webapp</module>
</modules>

子模块的POM元素配置(部分):

<!--使用parent元素声明父模块,parent元素下的groupId、artifactId和version指定
了父模块的坐标,是必须的。-->
 <parent>
<groupId>org.sonatype.mavenbook.multi</groupId>
<artifactId>simple-parent</artifactId>
<version>0.8-SNAPSHOT</version>
</parent>
<artifactId>simple-weather</artifactId>
<!--子模块如果没有声明packaging,即默认为jar-->
 <packaging>jar</packaging>

<name>Multi Chapter Simple Weather API</name>

6.扩展思考

1)聚合和继承存在一些共性和潜在的联系,在实际的应用中,经常将聚合模块的父模块和继承的父模块定义为同一个;并不是所有的 POM 元素都可以被继承。可以被继承的POM元素如下表所示:

2)Maven提供了dependencyManagement元素让子模块继承到父模块的依赖设置,又能保证子模块依赖使用的灵活性。完整的依赖声明 包含在在父POM中,子模块只需要配置简单的groupId和artifactId就能获得相应的依赖信息,从而引入正确的依赖。

类似的,Maven提供了pluginManagement元素帮助管理插件继承。

7.参考文献

1.许晓斌. Maven实战. 北京:机械工业出版社,2017.

2.《Guide to Working with Multiple Modules》

 


向师兄请教,学习使用禅道,拆解task2,学习控制安排学习进度。


三、遇到的问题

1)依赖管理相关

在父POM中使用dependencyManagement声明依赖能够同意项目范围中的依赖版本,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,避免多个子模块使用依赖版本不一致的情况,降低依赖冲突的几率。如果子模块不使用依赖的声明,即使在父POM中声明了,也不会有任何效果。

2)插件管理相关

如果子模块不需要使用父模块中的pluginManagement配置的插件,可以直接忽略。如果子模块需要不同的插件配置,则可以自行配制以覆盖父模块的pluginManagement配置。应该尽量使用父POM的pluginManagement元素统一生命的插件版本,避免潜在的插件不一致或者不稳定的问题,也更加易于维护。


四、今日收获

学习了Maven的继承与聚合配置方法以及多模块项目的创建方法。



返回列表 返回列表
评论

    分享到