Maven POM
POM的全称是Project Obejet Model, 整个项目的核心配置和信息都包含在这份xml文件中,一个最基本的pom文件要求至少有下列三要素:groupId, artifactId, version, 因此一个最小的POM配置文件如下所示:
4.0.0
com.mycompany.app
my-app
1
- 超级POM
作用:所有的POM全部继承自该POM, 意味着所有POM的默认配置也位于这里
举例的配置如下:
build directory: target
source directory: src/main/java
test source directory: src/test/java
output directory: classes-
位置:位于 maven 安装目录的lib文件夹下的一个jar包中,使用Java反编译工具(如Java-Decompiler)即可查看,以本机为例,超级POM的位置如下:
C:\Program Files (x86)\apache-maven-3.6.1\lib\maven-model-builder-3.6.1.jar
-
内容:
4.0.0 central Central Repository https://repo.maven.apache.org/maven2 default false central Central Repository https://repo.maven.apache.org/maven2 default false never ${project.basedir}/target ${project.build.directory}/classes ${project.artifactId}-${project.version} ${project.build.directory}/test-classes ${project.basedir}/src/main/java ${project.basedir}/src/main/scripts ${project.basedir}/src/test/java ${project.basedir}/src/main/resources ${project.basedir}/src/test/resources maven-antrun-plugin 1.3 maven-assembly-plugin 2.2-beta-5 maven-dependency-plugin 2.8 maven-release-plugin 2.5.3 ${project.build.directory}/site release-profile performRelease true true maven-source-plugin attach-sources jar-no-fork true maven-javadoc-plugin attach-javadocs jar true maven-deploy-plugin true
POM的继承
子 module 可以继承的元素如下
dependencies
developers and contributors
plugin lists (including reports)
plugin executions with matching ids
plugin configuration
resources
假设现有的项目结构如下:
.
|-- my-module
| `-- pom.xml
`-- pom.xml
两份 pom 的内容分别如下:
4.0.0
com.mycompany.app
my-app
1
4.0.0
com.mycompany.app
my-module
1
现在如果想让 my-module 继承 my-app 的元素,需要在 my-module/pom.xml 中添加 parent 节点,更改后的 my-module/pom.xml 配置如下
4.0.0
com.mycompany.app
my-app
1
../pom.xml
my-module
模块化聚合
Maven 中的 POM 除了继承,还可以使用聚合来联系各个独立的 POM。我们知道继承是在子模块下定义 parent 节点,这样每个子模块是知道自己的父 POM 是谁,聚合则和继承相反,聚合在父 POM 中定义它所有的子模块,这样做的好处是,父 POM 知道他所有的子模块,这样对父 POM 执行一些命令时,其所有的子模块也会得到执行。
假设现有的项目结构如下:
.
|-- my-module
| `-- pom.xml
`-- pom.xml
两份 pom 的内容分别如下:
4.0.0
com.mycompany.app
my-app
1
4.0.0
com.mycompany.app
my-module
1
现在想让 my-app 和 my-moudle 以聚合的方式连接,只需修改 my-app 的 POM 文件如下:
4.0.0
com.mycompany.app
my-app
1
pom
my-module
- 聚合和继承的区别
继承:使得子模块继承父 POM 的一些属性和配置,可以继承的元素如下:
dependencies
developers and contributors
plugin lists (including reports)
plugin executions with matching ids
plugin configuration
resources
聚合:对父 POM 执行命令时,相同的命令会同时在所有的子模块中执行一遍,方便多模块的打包和测试。注意聚合并不会继承父 POM 中的任何属性和配置。
继承+聚合:子模块继承父 POM 中的属性和配置,同时在父 POM 中执行命令时,在子模块也会得到执行。(常用+推荐)
Maven Properties
为了减少重复性的工作,POM 支持变量,从而达到修改一处,处处生效的效果。在每一个 POM 中,Maven 已经构建了一些内置的变量供我们使用,如
- ${project.groupId}
- ${project.artifactId}
- ${project.version}
- ${project.basedir}
- ${project.baseuri}
- ${maven.build.timestamp}
我们自己也可以声明变量,声明方式如下:
4.0.0
com.mycompany.app
my-app
1
1.4
1.8
UTF-8
5.1.38
UTF-8
3.2.6.RELEASE
声明变量之后,在 POM 文件的任何地方都可以引用该变量了。引用的方式如下:
commons-dbcp
commons-dbcp
${dbcp-version}
变量也存在继承关系,子模块也会覆盖父 POM 中定义的变量。这和面向对象的思想是一样的。
Maven Profile
profile的作用
我们在开发的时候经常需要不同的运行环境,不同运行环境的配置可能不相同,如数据源,日志文件等,Maven中的profile给予我们开发人员基于不同环境灵活的切换不同配置的能力-
在project中定义你的profile
我们在如下的pom中定义了两个不同的profile,分别是 test和production,根据不同的环境,Maven编译的时候会自动把这些变量编译到properties文件中test true /export/Logs/com.fanyank.app INFO jdbc:mysql://111.111.111.111:3358/app fanyank fanyank production /export/Logs/com.fanyank.app ERROR jdbc:mysql://222.222.222.222:3358/app fanyank fanyank -
如何使profile生效呢?
- 命令指定
使用 -P 指定生效的profile为production
mvn groupId:artifactId:goal -P production
- pom中指定
prod prod true 1.5 [1.5,) Windows XP Windows x86 5.1.2600 env test target/generated-sources/axistools/wsdl2java/ com/companyname/group - settings.xml
针对全局声明的profile(${maven.home}/conf/settings.xml),使用标签指定生效的profile
... profile-1 - 命令指定
-
我可以使用profile定制化哪些内容?
- external files
external files包括全局setting.xml, 你的profile只能用来修改如下三个参数, ,
其中用来存放你们公司的私服仓库地址, 用来存放私服plugin地址, 很少使用 - profile in POMs
定制任意数量的键值对,并在编译时期注入到properties中
a subset of the element, which consists of: - external files