Maven构建多模块工程
除非是简单的项目,实际工作中遇到的大部分Maven项目都是多模块的。每个项目模块都可以独立开发,其中一部分可能会用到其他模块的功能。如何使用 Maven 构建多模块项目? Maven提供了一种继承和聚合的方式来构建多模块工程,类似于Java中的继承和聚合的概念。 项目继承结构 项目继承可以复用父项目中创建的pom文件的内容。子项目可以自动继承父项目的pom文件属性。 例如,在父项目的 pom 文件
除非是简单的项目,实际工作中遇到的大部分Maven项目都是多模块的。每个项目模块都可以独立开发,其中一部分可能会用到其他模块的功能。如何使用 Maven 构建多模块项目?
Maven提供了一种继承和聚合的方式来构建多模块工程,类似于Java中的继承和聚合的概念。
项目继承结构
项目继承可以复用父项目中创建的pom文件的内容。子项目可以自动继承父项目的pom文件属性。
例如,在父项目的 pom 文件中定义如下属性:
<groupId>com.packt.cookbook</groupId>
<artifactId>项目继承</artifactId>
<包装>pom</包装>
<version>1.0-SNAPSHOT</version>
然后在子项目中添加父定义:
<父>
<groupId>com.packt.cookbook</groupId>
<artifactId>项目继承</artifactId>
<version>1.0-SNAPSHOT</version>
</父>
<modelVersion>4.0.0</modelVersion>
<artifactId>子</artifactId>
<包装>罐子</包装>
<name>子项目</name>
有了上面的定义,我们就可以在子项目中使用父项目的pom文件中定义的属性和依赖了。
笔记:
1.父项目必须是pom类型(打包)
2.父项目完全不知道子项目的存在,只有在子项目中定义的父元素才能指定父项目。
一般来说,父项目在子项目的父目录下。如果父项目不在子项目的父目录下,子项目会继续在maven仓库中查找符合要求的父项目。如果需要自己指定父项目的位置,可以添加<relativePath>的新配置。 /parent/pom.xml</relativePath>。
模块化聚合结构
一个父项目可以有很多子项目,而父项目不能清楚的知道它的子项目。使用模块聚合可以让父项目清晰的管理其子项目,子项目可以在不知道其父项目存在的情况下成为一个独立的存在。
如何在父项目中定义模块?只需在父项目的 pom 文件中定义 modules 元素,并为每个子模块创建一个新的模块配置。
<模块>
<模块>管理员</模块>
</模块>
这种管理方式虽然简单,但是不能继承父项目中定义的属性和依赖。每个子模块必须独立定义自己的依赖和属性,这并没有发挥maven项目管理的最大威力。
继承与聚合结合
如何让maven项目既便于继承又便于聚合?答案是结合这两个特性,同时使用继承和聚合。
比如让admin模块继承maven项目,而maven项目使用modules元素显式管理admin模块。
<?xml 版本u003d"1.0" 编码u003d"UTF-8"?>
<project xmlnsu003d"http://maven.apache.org/POM/4.0.0"
xmlns:xsiu003d"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocationu003d"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cc.adays</groupId>
<artifactId>maven</artifactId>
<包装>pom</包装>
<version>1.0-SNAPSHOT</version>
<构建>
<插件>
<插件>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<版本>2.6</版本>
<配置>
<存档>
<清单>
<addClasspath>true</addClasspath>
<mainClass>cc.adays.Main</mainClass>
</清单>
</存档>
</配置>
</插件>
<插件>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<版本>2.9</版本>
<执行>
<执行>
<id>复制依赖</id>
</执行>
</执行>
</插件>
</插件>
</构建>
<模块>
<模块>管理员</模块>
</模块>
</项目>
父元素在管理子模块的 pom 中定义。
<?xml 版本u003d"1.0" 编码u003d"UTF-8"?>
<project xmlnsu003d"http://maven.apache.org/POM/4.0.0"
xmlns:xsiu003d"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocationu003d"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<父>
<artifactId>maven</artifactId>
<groupId>cc.adays</groupId>
<version>1.0-SNAPSHOT</version>
</父>
<modelVersion>4.0.0</modelVersion>
<artifactId>管理员</artifactId>
</项目>
这样admin子元素可以直接使用父项目中定义的依赖和属性,而父项目maven可以清晰的管理自己的子元素,一石二鸟。
多模工程的依赖管理
最后,虽然继承确实很好用,但是有时候子项目不想拥有父项目的所有依赖,怎么办?此时,必须依赖依赖管理。在父项目中定义依赖管理,然后在子模块中选择性地使用父项目中已经定义的依赖,非常方便。
举个栗子:
<依赖管理>
<依赖项>
<依赖>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</依赖>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<依赖>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<版本>4.11</版本>
<范围>测试</范围>
</依赖>
</依赖>
</dependencyManagement>
父项目中定义了两个依赖,spring和Junit,但是我们只想在我们的子模块中使用JUnit,所以在子模块的pom文件中,我们定义:
<依赖项>
<依赖>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</依赖>
</依赖>
图片.png
这里不需要定义版本和范围,因为它们是从父项目自动继承的。
同样的,你可以通过这种方式管理maven的插件。您只需要使用插件管理元素。具体使用方式与管理依赖的方式相同。
更多推荐
所有评论(0)