本文介绍Maven项目构建中,pom.xml文件的生成规则和常用节点的使用方法。pom.xml官方网址:
pom简介
pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
pom.xml文件是Maven进行工作的主要配置文件。在这个文件中我们可以配置Maven项目的groupId、artifactId和version等Maven项目必须的元素;可以配置Maven项目需要使用的远程仓库;可以定义Maven项目打包的形式;可以定义Maven项目的资源依赖关系等等。对于一个最简单的pom.xml的定义必须包含modelVersion、groupId、artifactId和version这四个元素,当然这其中的元素也是可以从它的父项目中继承的。在Maven中,使用groupId、artifactId和version组成groupdId:artifactId:version的形式来唯一确定一个项目。
- groupId:项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo
- artifactId:项目的通用名称
- version:项目的版本
- packaging:打包机制,如pom,jar,maven-plugin,ejb,war,ear,rar,par
- POM关系:主要为依赖,继承,聚合。项目聚合要求父级设置packaging为pom模式。
pom包括了所有的项目信息,常用节点解释如下:
4.0.0 asia.banseon banseon-maven2 jar 1.0-SNAPSHOT banseon-maven http://www.baidu.com/banseon A maven project to study maven. jira http://jira.baidu.com/banseon Demo banseon@126.com banseon@126.com banseon@126.com http:/hi.baidu.com/banseon/demo/dev/ HELLO WORLD banseon banseon@126.com Project Manager Architect demo http://hi.baidu.com/banseon No -5 Apache 2 http://www.baidu.com/banseon/LICENSE-2.0.txt repo A business-friendly OSS license scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk http://svn.baidu.com/banseon demo http://www.baidu.com/banseon ...... ...... Windows XP Windows x86 5.1.2600 mavenVersion 2.0.3 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ ...... ...... ...... ...... ...... ...... banseon-repository-proxy banseon-repository-proxy http://192.168.1.169:9999/repository/ default ...... org.apache.maven maven-artifact 3.8.1 jar test spring-core org.springframework true ...... banseon-maven2 banseon maven2 file://${basedir}/target/deploy banseon-maven2 Banseon-maven2 Snapshot Repository scp://svn.baidu.com/banseon:/usr/local/maven-snapshot banseon-site business api website scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
pom常用节点使用方法
parent
org.springframework.boot spring-boot-starter-parent 2.0.6.RELEASE ../my-parent
relativePath是可选的,maven会首先搜索这个地址,在搜索本地远程repositories之前。parent节点主要是项目集成,项目聚合时使用。参考Spring Boot的pom文件,一般设置packaging为pom模式。构建一个父亲项目,可以不编写代码逻辑,只是管理多个项目之间公共的依赖。
dependencyManagement
是用于帮助管理chidren的dependencies的,配置在parent项目中。例如如果parent使用dependencyManagement定义了一个dependencyon junit:junit4.0,那么 它的children就可以只引用 groupId和artifactId,而version就可以通过parent来设置,这样的好处就是可以集中管理依赖的版本。maven的依赖(dependencies)有传递性,为了解决兼容性问题,就用exclusions来排除造成兼容性问题的依赖。参考Spring boot的使用方式:
com.querydsl querydsl-mongodb ${querydsl.version} mongo-java-driver org.mongodb com.rabbitmq amqp-client ${rabbit-amqp-client.version}
dependency
dependency下面包含众多字标签。
- type:默认为jar类型,常用的类型有:jar,ejb-client,test-jar...,可设置plugins中的extensions值为true后在增加新类型。
- scope:用来指定当前包的依赖范围
- compile(编译范围),是默认的范围,编译范围依赖在所有的classpath中可用,同时它们也会被打包。
- provided(已提供范围),只有在当JDK或者一个容器已提供该依赖之后才使用。
- runtime(运行时范围),在运行和测试系统的时候需要。
- test(测试范围),在一般的 编译和运行时都不需要。
- system(系统范围),与provided类似
- optional:设置指依赖是否可选,默认为false,即子项目默认都继承,为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似 。
- exclusions:如果X需要A,A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion。
- exclusion:将B从依赖树中删除,如上配置,alibaba.apollo.webx不想使用com.alibaba.external ,但是alibaba.apollo.webx是集成了com.alibaba.external,r所以就需要排除掉。
dependency是用于具体孩子项目的pom文件中,dependency的应用示例:
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-logging
modules
在聚合模式下,pom.xml 中下一部分列出了项目的子模块。这些模块在modules元素中定义,每个modules 元素对应了一个simple-parent/目录下的子目录。Maven知道去这些子目录寻找pom.xml 文件,并且,在构建的simp-parent 的时候,它会将这些子模块包含到要构建的项目中。
对于多模块的project,outer-module没有必需考虑inner-module的dependencies,当列出modules的时候,modules的顺序是不重要的,因为maven会自动根据依赖关系来拓扑排序,上级pom设置packaging为pom模式。modules例子如下 :
com.epet.microservices wl-top 2.0.7 wl-parent 1.0.0-SNAPSHOT pom wl-parent http://maven.apache.org common-wl api-wl microservices-wl
properties
是为pom定义一些常量,在pom中的其它地方可以直接引用。参考Spring Boot中的定义和使用如下:
UTF-8 1.8 @ ${java.version} UTF-8 ${java.version}
使用方式 如下 :${java.version}
resources
resources描述工程中资源的位置,一般结合profiles标签,定义在不同的环境下使用不同的资源配置文件。Spring Boot中该标签的示例如下:
true ${basedir}/src/main/resources **/application*.yml **/application*.yaml **/application*.properties ${basedir}/src/main/resources **/application*.yml **/application*.yaml **/application*.properties
结合profiles标签,可去掉相关的基本配置资源文件后,制定使用激活的配置文件。如:<directory>src/main/resources/${profiles.active}</directory>。
子标签介绍:
- targetPath:指定build资源具体目录,默认是base directory。
- filtering:指定是否将filter文件的变量值在这个resource文件有效。即上面说的filters里定义的*.property文件。例如上面就指定那些变量值在configuration文件无效,设置为false。
- directory:指定属性文件的目录,build的过程需要找到它,并且将其放到targetPath下,默认的directory是${basedir}/src/main/resources。
- testResources:包含测试资源元素。默认的测试资源路径是${basedir}/src/test/resources,测试资源是不部署的。
include:
指明需要包括的资源:${basedir}/src/main/resources目录下的,所有application.*文件都需要包括。exclude:
指代不需要处理的资源,仅处理${basedir}/src/main/resources资源目录中除application.*之外的资源。
profiles
在开发过程中,软件会面对不同的运行环境,比如开发环境、测试环境、生产环境,而软件在不同的环境中,有的配置可能会不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置,那每次将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力。maven提供了一种方便的解决这种问题的方案,就是profile功能。profile可以定义一系列的配置信息,然后指定其激活条件。这样就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。针对于特定项目的profile配置可以定义在该项目的pom.xml中。使用举例如:
dev dev true release release beta beta
配置好profiles文件后,设置filtering为true,表示允许覆盖。在项目发布时,可通过Maven命令制定激活哪一个具体的配置文件,命令为:maven package -P dev-Dmaven.test.skip=true
src/main/resources/${profiles.active} true
pluginManagement
pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承。pluginManagement节点必须放在bulid节点下面。一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且在父POM中定义了版本之后,子模块中直接应用。groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。plugins
和 pluginManagement
的区别,类似 dependencies
和 dependencyManagement
的区别。plugins
下的 plugin
是真实使用的,而 pluginManagement
下的 plugins
下的 plugin
则仅仅是一种声明,子项目中可以对 pluginManagement
下的 plugin
进行信息的选择、继承、覆盖等。Spring Boot中pluginManagement的应用举例如下:
org.apache.johnzon johnzon-maven-plugin ${johnzon.version} org.jetbrains.kotlin kotlin-maven-plugin ${kotlin.version}
plugins
plugins就是直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。该标签必须放在bulid标签中,使用举例如下:
maven-source-plugin attach-sources package jar-no-fork org.codehaus.mojo versions-maven-plugin
distributionManagement
<distributionManagement>的作用: 负责管理构件的发布。这是一个环境变量 。一般用于将本地的生成的包上传到远程私服上去。 <distributionManagement>中的<repository>标签:
- <uniqueVersion>指定是否产生一个唯一性的version number还是使用address里的其中version部分.(true or false) 。其中标签id的值与本地Maven配置文件seting.xml中设置的远程私服的id一样。
- <id> 库的id
- <name> 库的名称
- <url> 库的url
- <layout> default或者legacy
<distributionManagement> 中的 <repository> && <snapshotsrepository>各自的含义:maven仓库分为两种 release发布仓库(<repository>) 和 snapshot快照仓库(<snapshotsrepository>),snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库用来保存稳定的发行版本。定义一个组件/模块为快照版本只需要在pom文件中的该模板的版本号后面加上 -SNAPSHOT就可以了。 注意:必须是大写maven会根据模块的版本号(pom文件中的<version>版本号</version>)中是否带有-SNAPSHOT来判断这个是快照版本还是正式版本.。可通过maven命令:mvn clean deploy。
false corp1 Corporate Repository scp://repo/maven2 default true propSnap Propellors Snapshots sftp://propellers.net/maven legacy
mvn打包命令
- mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
- mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。
- mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。
由上面的分析可知主要区别如下,
- package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。
- install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库。
- deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。
build
- defaultGoal :默认的目标,必须跟命令行上的参数相同,如:jar:jar,或者与时期parse相同,例如install。
- directory:指定build target目标的目录,默认为$(basedir}/target,即项目根目录下的target。
- finalName:指定去掉后缀的工程名字,例如:默认为${artifactId}-${version}。
- filters:定义指定filter属性的位置,例如filter元素赋值filters/filter1.properties,那么这个文件里面就可以定义name=value对,这个name=value对的值就可以在工程pom中通过${name}引用,默认的filter目录是${basedir}/src/main/fiters/。
reporting设置
reporting包含site生成阶段的一些元素,某些maven plugin可以生成reports并且在reporting下配置。reporting里面的reportSets和build里面的executions的作用都是控制pom的不同粒度去控制build的过程,我们不单要配置plugins,还要配置那些plugins单独的goals。样例如下:
... sunlink javadoc true http://java.sun.com/j2se/1.5.0/docs/api/
参考网址
- pom.xml参考网址:
- pom.xml文件示例:
- Maven-dependencyManagement的使用:
- Maven properities:
- Maven module:
- Maven profile动态配置文件:
- :
- :
- nexus建立maven仓库私服:
- pom.xml文件: