什么是POM
全称:Project Object Model,项目对象模型,是Maven的基本工作单元。存在形式是一个XML格式的文件,这个文件里包含了Maven构建项目时所需的信息。
Super POM
在Maven中,所有的POM都继承一个基础的POM,这个POM称为Super POM(传送门)。
默认配置
在Super POM中,有很多默认的配置,对于我们理解Maven的一些构建行为很有帮助。
1)基本信息
...
//构建输出目录
<directory>${project.basedir}/target</directory>
//源代码编译产生的class文件输出路径
<outputDirectory>${project.build.directory}/classes</outputDirectory>
//打包之后的文件名称
<finalName>${project.artifactId}-${project.version}</finalName>
//测试代码编译产生的class文件输出路径
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
//源代码存放路径
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
//源脚本存放路径
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
//单元测试代码存放路径
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
...
2)资源文件
${project.basedir}/src/main/resources下的资源文件在项目编译之后会被复制一份到${project.build.directory}/classes。测试相关的资源文件类似。
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
3)仓库管理
默认情况下,Maven从https://repo.maven.apache.org/maven2获取依赖和插件。
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
...
以上的默认配置,都可以在子POM中覆盖。
最小份POM
POM中至少包含以下元素,如下例子
- project
- modelVersion
- groupId
- artifactId
- version
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
POM之间的关系
继承
继承可以复用配置,Super POM即为继承的一个典例,下面给出2种不同项目结构的继承实现。
1)例子1
.parent
|-- my-module
| `-- pom.xml
`-- pom.xml
my-module如果想继承parent的pom,如下
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<artifactId>my-module</artifactId>
</project>
2)例子2
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
my-module如果想继承parent的pom,这是需要使用到relativePath
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
聚合
聚合可以实现多模块构建,要想使用聚合需要执行以下2个步骤
- 修改父POM的pacakaging=pom
- 在父pom种指定modules
比如,项目模块如下
.parent
|-- my-module
| `-- pom.xml
`-- pom.xml
parent如果想聚合mly-module,那么配置如下
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>my-module</module>
</modules>
</project>
同理继承,指定模块时可以使用相对路径
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
继承与聚合,如何抉择
如果多个Maven项目存在相同的配置,那么可以通过继承重构这些项目,复用相同的配置。
如果希望多个项目一起构建,那么就可以使用聚合。
继承与聚合不是非此即彼的关系,可以同时使用,具体项目,具体分析,灵活组合。