博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maven pom.xml文件深度学习
阅读量:6330 次
发布时间:2019-06-22

本文共 22023 字,大约阅读时间需要 73 分钟。

    本文介绍Maven项目构建中,pom.xml文件的生成规则和常用节点的使用方法。pom.xml官方网址:

pom简介

    pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。

    pom.xml文件是Maven进行工作的主要配置文件。在这个文件中我们可以配置Maven项目的groupIdartifactIdversionMaven项目必须的元素;可以配置Maven项目需要使用的远程仓库;可以定义Maven项目打包的形式;可以定义Maven项目的资源依赖关系等等。对于一个最简单的pom.xml的定义必须包含modelVersiongroupIdartifactIdversion这四个元素,当然这其中的元素也是可以从它的父项目中继承的。在Maven中,使用groupIdartifactIdversion组成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
View Code

 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>。

子标签介绍:

  1. targetPath:指定build资源具体目录,默认是base directory。
  2. filtering:指定是否将filter文件的变量值在这个resource文件有效。即上面说的filters里定义的*.property文件。例如上面就指定那些变量值在configuration文件无效,设置为false。
  3. directory:指定属性文件的目录,build的过程需要找到它,并且将其放到targetPath下,默认的directory是${basedir}/src/main/resources
  4. testResources:包含测试资源元素。默认的测试资源路径是${basedir}/src/test/resources,测试资源是不部署的。
  5. include:指明需要包括的资源:${basedir}/src/main/resources目录下的,所有application.*文件都需要包括。
  6. 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的生命周期。pluginspluginManagement 的区别,类似 dependenciesdependencyManagement 的区别。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文件:

转载于:https://www.cnblogs.com/wlandwl/p/pom.html

你可能感兴趣的文章
深入了解setInterval方法
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>
FFMPEG中关于ts流的时长估计的实现(转)
查看>>
Java第三次作业
查看>>
【HDOJ 3652】B-number
查看>>
android代码混淆笔记
查看>>
Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集
查看>>
BMP文件的读取与显示
查看>>
Flash文字效果
查看>>
各种排序算法总结篇(高速/堆/希尔/归并)
查看>>
使用c#訪问Access数据库时,提示找不到可安装的 ISAM
查看>>
Highcharts X轴纵向显示
查看>>
windows 注册表讲解
查看>>
【算法】论平衡二叉树(AVL)的正确种植方法
查看>>
基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
查看>>
【原】东拼西凑PBR(1):PBR基础
查看>>
react 从零开始搭建开发环境
查看>>
scala recursive value x$5 needs type
查看>>
ps -ef |grep 输出的具体含义
查看>>