博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
maven POM —— maven权威指南学习笔记(五)
阅读量:6420 次
发布时间:2019-06-23

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

1. 简介

Archetype插件通过 pom.xml 文件创建了一个项目。这就是项目对象模型 (POM),一个项目的声明性描述。

当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里的信息。

这个POM文件在maven1中是project.xml,在maven2时改为pom.xml。

4.0.0
MavenLearn
simple
pom
1.0-SNAPSHOT
junit
junit
4.11
test

上面是一个简单的pom.xml文件的例子,可以看到,在上面这个文件中主要定义了,项目的基本信息 和 项目的依赖信息(dependencies)。

项目的基本信息中最重要的就是: groupId,artifactId,version,这三个关键信息组成了一个项目的坐标(Coordinate),它可以唯一的标示一个项目,也是项目依赖的根据。

  • groupId:指定 团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创 建这个项目的组织名称的逆向域名(reverse domain name)开头。例如,来自Sonatype 的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以 org.apache开头的groupId。
  • artifactId:在groupId下的表示一个单独项目的唯一标识符。
  • version:指定一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个 特定的版本。例如,对于在开发中的项目用“SNAPSHOT”标记。

以上三个标记 加上 modelVersion(设置为4.0.0) 都是pom.xml中必需的。

POM文件中除了可以指定上面提到的项目基本信息,dependencies,还可以定义插件, profiles,以及项目描述(description),研发人员(developer),邮件列表(mailing list)等。

 

2. Maven变量

我们在定义pom.xml 的时候,尤其是定义 dependencies时,通常会引入同一个版本的好多文件,比如spring 框架下,某个版本的spring-context,spring-test,spring-core,spring-beans,spring-webmvc 等等,即便它们下面有些是有依赖关系的,可以由maven帮我们做了,但是还有好多都是要自己写的,相当麻烦,如果这个你还可以接受,毕竟只定义一次嘛,那如果spring在未来哪天出了一个新特性,你特别想用,要升级一下,那又得重新改一遍,没准还改错了呢。这个时候就需要用到maven的变量了。这个时候就需要用到maven的变量了。

maven变量分为自定变量内置变量

2.1 自定义变量

在pom文件中我们可以这样定义变量,

org.springframework
3.1.1.RELEASE

在使用的时候,通过如下方法引用

${spring.group}
spring-context
${spring.version}

 

需要注意的是,在“<properties>”中除了可以自己构建需要的变量,也可以指定项目内置变量的值,例如,设置源码编码、生成报告编码和surefire插件的jvm运行参数为utf-8:

UTF-8
UTF-8
-Dfile.encoding=UTF-8

 

2.2 内置变量

  • ${basedir} 项目根目录
  • ${project.build.directory} 构建目录,缺省为target
  • ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
  • ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
  • ${project.packaging} 打包类型,缺省为jar
  • ${project.xxx} 当前pom文件的任意节点的内容

 

3. 继承(Inheritance)聚合(Aggregation)

接下来说一下pom的继承(Inheritance)聚合(Aggregation)

继承是用在多个子项目,相同的配置的部分,可以抽离出来形成一个父pom,子项目都继承它。这样好处是,减少配置,配置的地方少了,出错的可能就减小了;抽取出了公共的配置,便于维护。

聚合是把多个子项目合并到一起,可以用一个命令就完成整个项目的集成。举个例子,一个系统有三个子模块,由三个团队分别负责开发,都开发完之后,需要发布系统,聚合之后就可以一个命令搞定,而不是各个子项目分别打包,再集成为一个,各种问题。。。

 

3.1 pom继承(Inheritance)

继承的内容包括:dependencies、研发者信息、插件列表(包含reports)、插件的执行设置(plugin executions with matching ids)、插件配置、资源配置(resource)。

一个列子:

com.mycompany.app:my-app:1,其配置如下:

4.0.0
com.mycompany.app
my-module
1
pom
 

它有一个子模块,my-module,目录结构如下:

如果让my-module继承my-app,那其pom可以如下配置(前提是my-app已经install到了local repository,或者my-app的pom文件在my-module pom文件的上一级目录):

com.mycompany.app
my-app
1
4.0.0
com.mycompany.app
my-module
1

如果不是上面的目录结构,又没有install到本地仓库的话,怎么破,比如这种结构:

.

额。。直接用<relativePath>标签指定父级pom的路径就好了,

com.mycompany.app
my-app
1
../parent/pom.xml
4.0.0
my-module

 

3.2 pom聚合(Aggregation)

其实聚合的构建方法和继承的是很相似的,这里列举一个例子,假设目录如下:

parent是用于聚合的,my-module是子项目,

parent的pom如下:

4.0.0
com.mycompany.app
my-app
1
pom
../my-module

注意两点:

  • 必须指定<packaging>pom</packaging>
  • 在module中,可以通过相对路径指定要聚合的项目的pom路径,例子中只有一个子项目,如果有多个,都在modules中指定就可以了

被聚合的项目my-module的pom如下:

4.0.0
com.mycompany.app
my-module
1

 

3.3 继承与聚合小结

总结一下继承和聚合

区别

1.对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。

2.对于继承关系的父 POM来说,它不知道有哪些子模块继承与它,但那些子模块都必须知道自己的父 POM是什么。

共同点

1.聚合 POM与继承关系中的父POM的 packaging都是pom

2.聚合模块与继承关系中的父模块除了 POM之外都没有实际的内容。

 

3.4 继承(Inheritance)+ 聚合(Aggregation)

我们可以单独使用继承或者聚合的特性,也可以结合起来使用,

下面来一个集合继承与聚合的实例,

首先用idea建立四个项目,目录如图:

最终的目的是:pomLearn目录用于聚合,module1,module2继承module_parent

现在先配置好基础项目的关系,四个配置文件如下:

pomLearn——聚合 aggregation

注意:

  • packaging为pom
  • 在聚合的时候,父pom目录也需要引入"<module>"中,目录的路径是相对路劲。

 

module_parent

注意:

  • packaging为pom
  • 子项目继承module_parent后,即可不引入junit了

 

module1

注意:

  • 子项目的groupId可以与父项目不同;相同时可以省略

 

module2

 

ok,运行一下mvn clean,出现以下结果,配置成功:

D:\Java\jdk1.8.0_65\bin\java -Dmaven.multiModuleProjectDirectory=$M2_HOME -Dmaven.home=D:\Coding\apache-maven-3.3.3 -Dclassworlds.conf=D:\Coding\apache-maven-3.3.3\bin\m2.conf -Didea.launcher.port=7539 "-Didea.launcher.bin.path=D:\Coding\JetBrains\IntelliJ IDEA 14.0\bin" -Dfile.encoding=UTF-8 -classpath "D:\Coding\apache-maven-3.3.3\boot\plexus-classworlds-2.5.2.jar;D:\Coding\JetBrains\IntelliJ IDEA 14.0\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher -Didea.version=14.0 clean

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] module_parent
[INFO] module1
[INFO] module2
[INFO] pomLearn
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building module_parent 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module_parent ---
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building module1 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module1 ---
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building module2 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ module2 ---
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building pomLearn 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ pomLearn ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] module_parent ...................................... SUCCESS [  0.135 s]
[INFO] module1 ............................................ SUCCESS [  0.003 s]
[INFO] module2 ............................................ SUCCESS [  0.002 s]
[INFO] pomLearn ........................................... SUCCESS [  0.001 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.230 s
[INFO] Finished at: 2016-01-19T23:50:18+08:00
[INFO] Final Memory: 8M/309M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

 

3.5 Super POM

在没有特别指定的情况下,我们使用的pom文件都是继承自maven的Super POM,文章最后列出的就是Maven 2.1.x 的Super POM,也可以参看maven document 的 。

4.0.0
Maven Default Project
central
Maven Repository Switchboard
default
http://repo1.maven.org/maven2
false
central
Maven Plugin Repository
http://repo1.maven.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
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-2
maven-clean-plugin
2.2
maven-compiler-plugin
2.0.2
maven-dependency-plugin
2.0
maven-deploy-plugin
2.4
maven-ear-plugin
2.3.1
maven-ejb-plugin
2.1
maven-install-plugin
2.2
maven-jar-plugin
2.2
maven-javadoc-plugin
2.5
maven-plugin-plugin
2.4.3
maven-rar-plugin
2.2
maven-release-plugin
2.0-beta-8
maven-resources-plugin
2.3
maven-site-plugin
2.0-beta-7
maven-source-plugin
2.0.4
maven-surefire-plugin
2.4.3
maven-war-plugin
2.1-alpha-2
${project.build.directory}/site
release-profile
performRelease
true
true
org.apache.maven.plugins
maven-source-plugin
attach-sources
jar
true
org.apache.maven.plugins
maven-javadoc-plugin
attach-javadocs
jar
true
org.apache.maven.plugins
maven-deploy-plugin
true
View Code

 

 

 

 

参考:

Introduction to the POM,maven document,

聚合与继承,iqeq00,

Maven聚合与继承,chenzhou123520,

一个多maven项目聚合的实例,kyfxbl,

maven权威指南

转载于:https://www.cnblogs.com/chrischennx/p/5119673.html

你可能感兴趣的文章
特征选择
查看>>
在Winform程序中设置管理员权限及为用户组添加写入权限
查看>>
RTMP直播到FMS中的AAC音频直播
查看>>
多能互补提速 加快我国能源转型和现代能源体系建设
查看>>
Redis开发运维实践高可用和集群架构与实践(二)
查看>>
程序员的常见“谎话”:对,这是一个已知 Bug
查看>>
如何侦查SQL执行状态
查看>>
CentOS 7 命令行如何连接无线网络
查看>>
Ubuntu 12.04上享用新版本Linux的功能
查看>>
logstash + grok 正则语法
查看>>
Zimbra开源版(v8.6)安装说明
查看>>
Android性能优化之TraceView和Lint使用详解
查看>>
基于pgrouting的路径规划之一
查看>>
LBS核心技术解析
查看>>
Fible Channel over Convergence Enhanced Ethernet talk about
查看>>
讨论:今日头条适配方案使用中出现的问题
查看>>
CSS3 3D翻转动画
查看>>
要命啦!Word中快速录入大全,内含快捷键小技巧,快来一起学习!
查看>>
javascript实现音频mp3播放
查看>>
html5-离线缓存
查看>>