POM(Project Object Model)是Maven工程的工作基础,以pom.xml的形式存在项目中。在我们的工程中有几个元素是必须的:
- project root
- modelVersion - 应被设置为4.0.0
- groupId - 项目组id
- artifactId - 项目id
- version - 项目版本
假设你有一个项目com.mycompany.app:my-app:1.0项目结构如下:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1.0</version>
</project>
如果我们想要my-module继承上级工程的pom配置,则可将pom.xml改为如下:
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1.0</version>
</project>
此外,如果我们希望工程的groupId跟version保持与父工程一致,则可去掉 groupId和version:
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-module</artifactId>
</project>
下面就以一个比较完整pom.xml文件为例说明一下:
<project>
<parent>
<!--被继承的父项目的全球唯一标识符-->
<groupId>com.mycompany.app</groupId>
<!--被继承的父项目的构件标识符-->
<artifactId>my-app</artifactId>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->
<version>1.0</version>
</parent>
<!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。-->
<modelVersion>4.0.0</modelVersion>
<!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app-->
<groupId>com.mycompany.app</groupId>
<!--构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源码,二进制发布和WARs等。-->
<artifactId>my-module</artifactId>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->
<version>1.0</version>
<!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型-->
<packaging>jar</packaging>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->
<!--(1表示大版本号,0表示小版本号)SNAPSHOT:快照,表示该版本正在开发中/release:稳定版本/beta:公测版/alpha:内部测试版/GA:正式发布版-->
<version>1.0-SNAPSHOT</version>
<!--项目的名称, Maven产生的文档用-->
<name>项目名称</name>
<!--项目主页的URL, Maven产生的文档用-->
<url>项目主页URL</url>
<!--项目的详细描述,Maven产生的文档用。当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标签), 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。-->
<description>Maven工程的描述信息</description>
<!--开发人员的列表信息-->
<developers>
<developer>
<name>开发者1</name>
<!--等其他填写的信息-->
</developer>
<developer>
<name>开发者2</name>
<!--等其他填写的信息-->
</developer>
</developers>
<!--许可证信息-->
<licenses></licenses>
<!--组织信息-->
<organization></organization>
<!--依赖项信息,依赖到的jar包-->
<dependencies>
<!--第一个依赖jar-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<type></type>
<!--依赖的范围,表示本依赖应用于项目中的哪些阶段如下:
compile:默认值。表示该依赖在编译、测试、运行阶段都有效
provided:在编译和测试时有效,在运行时不会被加入
runtime:在测试和运行时有效
test:在测试范围内有效
system:在编译和测试时有效,与provided类似,不过要与本地系统相关联,可移植性差
import:在dependenceManagement中使用,表示导入别的项目的依赖到本项目中-->
<scope>test</scope>
<!--设置依赖是否可选,取值为true或false,默认是false,如果是false,则子项目必然继承父项目的依赖(不可选),若为true,则子项目可以自己选择是否需要父项目的依赖,若需要就手动引入,若不需要就不引入-->
<optional>true</optional>
<!--排除依赖列表,如果a依赖b,b依赖c,那么默认的a依赖c,但是我a就是不想依赖c,则可以在这里排除掉c-->
<exclusions>
<exclusion></exclusion>
</exclusions>
</dependency>
<!--第二个依赖jar-->
<dependency>
<!--....-->
</dependency>
</dependencies>
<!--一般为了统一管理多个项目,让他们的依赖都具有相同的版本,在所有子模块中的依赖标签都不指定明确的版本号,maven会自动向其父级查找,直到找到一个父模块拥有dependencyManagement标签,指定了所有依赖的版本号。这就保证所有模块的依赖版本都来自于同一个父模块的dependencyManagement指定。-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
</dependencyManagement>
<!--插件对构建项目的支持-->
<build>
<!--插件-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.6</version>
<!--表示该插件在什么时候执行-->
<executions>
<execution>
<!--表示在打包阶段之后执行本插件-->
<phase>package</phase>
<!--执行方式,一般是与java的启动参数类似,例如:run等-->
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--多模块共同管理,一起编译-->
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>
<!--属性,可以指定变量,如下所示-->
<properties>
<!--变量名称自己定义,获取变量值使用:${变量名称} -->
<junit.version>4.10</junit.version>
</properties>
</project>