build——项目构建需要的信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 <build > <sourceDirectory /> <testSourceDirectory /> <outputDirectory /> <testOutputDirectory /> <scriptSourceDirectory /> <resources > <resource > <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </resource > </resources > <testResources > <testResource > <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </testResource > </testResources > <pluginManagement > <plugins > <plugin > <groupId /> <artifactId /> <version /> <extensions /> <executions > <execution > <id /> <phase /> <goals /> <inherited /> <configuration /> </execution > </executions > <dependencies > <dependency > ...... </dependency > </dependencies > <inherited /> <configuration /> </plugin > </plugins > </pluginManagement > <plugins > <plugin > <groupId /> <artifactId /> <version /> <extensions /> <executions > <execution > <id /> <phase /> <goals /> <inherited /> <configuration /> </execution > </executions > <dependencies > <dependency > ...... </dependency > </dependencies > <goals /> <inherited /> <configuration /> </plugin > </plugins > <extensions > <extension > <groupId /> <artifactId /> <version /> </extension > </extensions > <defaultGoal /> <directory /> <finalName /> <filters /> </build >
build标签定义了构建项目需要的信息,这部分信息对于定制化项目构建是非常重要的。这里会根据build的子元素的特点,简单地分类讲解。
1、路径管理 1 2 3 4 5 6 7 8 9 10 11 <sourceDirectory /> <testSourceDirectory /> <outputDirectory /> <testOutputDirectory /> <scriptSourceDirectory />
路径管理定义了各种源码和编译结果的输出路径。如果遵循maven默认的路径约定,这里的几个元素是不需要配置的。这些元素包括:
sourceDirectory:项目源码目录,定义的是相对于pom文件的相对路径;
testSourceDirectory:项目单元测试源码目录,定义的也是是相对于pom文件的相对路径;
outputDirectory:被编译过的应用程序class文件存放的目录,也是是相对于pom文件的相对路径;
testOutoutDIrectory:被编译过的测试class文件存放的目录,也是是相对于pom文件的相对路径;
scriptSourceDirectory:项目脚本源码目录,也是是相对于pom文件的相对路径。由于脚本是解释性的语言,所以该目录下的内容,会直接被拷贝到输出目录,而不需要编译。
目录元素集合存在于 build
元素中,它为整个 POM 设置了各种目录结构。由于它们在配置文件构建中不存在,所以这些不能由配置文件更改。
如果上述目录元素的值设置为绝对路径(扩展属性时),则使用该目录。否则,它是相对于基础构建目录: ${basedir}
。
2、资源管理 资源的配置。资源文件通常不是代码,不需要编译,而是在项目需要捆绑使用的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <resources > <resource > <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </resource > </resources > <testResources > <testResource > <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </testResource > </testResources >
resources : 资源元素的列表,每个资源元素描述与此项目关联的文件和何处包含文件。
targetPath : 指定从构建中放置资源集的目录结构。目标路径默认为基本目录。将要包装在 jar 中的资源的通常指定的目标路径是 META-INF。
filtering : 值为 true 或 false。表示是否要为此资源启用过滤。请注意,该过滤器 * .properties
文件不必定义为进行过滤 - 资源还可以使用默认情况下在 POM 中定义的属性(例如$ {project.version}),并将其传递到命令行中“-D”标志(例如,“-Dname = value”)或由 properties 元素显式定义。过滤文件覆盖上面。
directory : 值定义了资源的路径。构建的默认目录是${basedir}/src/main/resources
。
includes : 一组文件匹配模式,指定目录中要包括的文件,使用*作为通配符。
excludes : 与 includes
类似,指定目录中要排除的文件,使用*作为通配符。注意:如果 include
和 exclude
发生冲突,maven 会以 exclude
作为有效项。
testResources : testResources
与 resources
功能类似,区别仅在于:testResources
指定的资源仅用于 test 阶段,并且其默认资源目录为:${basedir}/src/test/resources
。
3、插件管理 与 dependencyManagement
很相似,在当前 POM 中仅声明插件,而不是实际引入插件。子 POM 中只配置 groupId
和 artifactId
就可以完成插件的引用,且子 POM 有权重写 pluginManagement 定义。
插件管理相关的元素有两个,包括pluginManagement和plugins。pluginManagement中有子元素plugins,它和project下的直接子元素plugins的区别是,pluginManagement主要是用来声明子项目可以引用的默认插件信息,这些插件如果只写在pluginManagement中是不会被引入的。project下的直接子元素plugins中定义的才是这个项目中真正需要被引入的插件。
它的目的在于统一所有子 POM 的插件版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <pluginManagement > <plugins > <plugin > <groupId /> <artifactId /> <version /> <extensions /> <executions > <execution > <id /> <phase /> <goals /> <inherited /> <configuration /> </execution > </executions > <dependencies > ...... </dependencies > <inherited /> <configuration /> </plugin > </plugins > </pluginManagement > <plugins > ...... </plugins >
executions :需要记住的是,插件可能有多个目标。每个目标可能有一个单独的配置,甚至可能将插件的目标完全绑定到不同的阶段。执行配置插件的目标的执行。
id : 执行目标的标识。
goals : 像所有多元化的 POM 元素一样,它包含单个元素的列表。在这种情况下,这个执行块指定的插件目标列表。
phase : 这是执行目标列表的阶段。这是一个非常强大的选项,允许将任何目标绑定到构建生命周期中的任何阶段,从而改变 maven 的默认行为。
inherited : 像上面的继承元素一样,设置这个 false 会阻止 maven 将这个执行传递给它的子代。此元素仅对父 POM 有意义。
configuration : 与上述相同,但将配置限制在此特定目标列表中,而不是插件下的所有目标。
4、构建扩展 扩展是在此构建中使用的 artifacts 的列表。它们将被包含在运行构建的 classpath 中。它们可以启用对构建过程的扩展(例如为 Wagon 传输机制添加一个 ftp 提供程序),并使活动的插件能够对构建生命周期进行更改。简而言之,扩展是在构建期间激活的 artifacts。扩展不需要实际执行任何操作,也不包含 Mojo。因此,扩展对于指定普通插件接口的多个实现中的一个是非常好的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <build > ... <extensions > <extension > <groupId /> <artifactId /> <version /> </extension > </extensions > ... </build > </project >
5、其他配置 build 可以分为 “project build” 和 “profile build”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <build > ...</build > <profiles > <profile > <build > ...</build > </profile > </profiles > </project >
基本构建配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <build > <defaultGoal > install</defaultGoal > <directory > ${basedir}/target</directory > <finalName > ${artifactId}-${version}</finalName > <filters > <filter > filters/filter1.properties</filter > </filters > ... </build >
defaultGoal : 默认执行目标或阶段。如果给出了一个目标,它应该被定义为它在命令行中(如 jar:jar)。如果定义了一个阶段(如安装),也是如此。
directory :构建时的输出路径。默认为:${basedir}/target
。
finalName :这是项目的最终构建名称(不包括文件扩展名,例如:my-project-1.0.jar)
filter :定义 * .properties
文件,其中包含适用于接受其设置的资源的属性列表(如下所述)。换句话说,过滤器文件中定义的“name = value”对在代码中替换$ {name}字符串。
6、reporting——报表规范 报告包含特定针对 site
生成阶段的元素。某些 maven 插件可以生成 reporting
元素下配置的报告,例如:生成 javadoc 报告。reporting
与 build
元素配置插件的能力相似。明显的区别在于:在执行块中插件目标的控制不是细粒度的,报表通过配置 reportSet
元素来精细控制。而微妙的区别在于 reporting
元素下的 configuration
元素可以用作 build
下的 configuration
,尽管相反的情况并非如此( build
下的 configuration
不影响 reporting
元素下的 configuration
)。
另一个区别就是 plugin
下的 outputDirectory
元素。在报告的情况下,默认输出目录为 ${basedir}/target/site
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <reporting > <excludeDefaults /> <outputDirectory /> <plugins > <plugin > <groupId /> <artifactId /> <version /> <inherited /> <configuration /> <reportSets > <reportSet > <id /> <configuration /> <inherited /> <reports /> </reportSet > </reportSets > </plugin > </plugins > </reporting > ... </project >
项目信息 项目信息相关的这部分标签都不是必要的 ,也就是说完全可以不填写。
它的作用仅限于描述项目的详细信息。
下面的示例是项目信息相关标签的清单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <name > maven-notes</name > <description > maven 学习笔记</description > <url > https://github.com/dunwu/maven-notes</url > <inceptionYear > 2022</inceptionYear > <licenses > <license > <name > Apache 2</name > <url > http://a.b.com/nanxs/LICENSE-1.0.txt</url > <distribution > repo</distribution > <comments > A business-friendly OSS license</comments > </license > </licenses > <organization > <name > demo</name > <url > http://a.b.com/nanxs</url > </organization > <developers > <developer > <id > HELLO WORLD</id > <name > nanxs</name > <email > 123@abc.com</email > <url /> <roles > <role > Project Manager</role > <role > Architect</role > </roles > <organization > demo</organization > <organizationUrl > http://a.b.com/nanxs</organizationUrl > <properties > <dept > No</dept > </properties > <timezone > -5</timezone > </developer > </developers > <contributors > <contributor > <name /> <email /> <url /> <organization /> <organizationUrl /> <roles /> <timezone /> <properties /> </contributor > </contributors > ... </project >
这部分标签都非常简单,基本都能做到顾名思义,且都属于可有可无的标签,所以这里仅简单介绍一下:
name - 项目完整名称
description - 项目描述
url - 一般为项目仓库的 host
inceptionYear - 开发年份
licenses - 开源协议
organization - 项目所属组织信息
developers - 项目开发者列表
contributors - 项目贡献者列表,<contributor>
的子标签和 <developer>
的完全相同。
备注:maven可以通过mvn site命令生成项目的相关文档。
环境配置 1、issueManagement——描述性信息 这定义了所使用的缺陷跟踪系统(Bugzilla,TestTrack,ClearQuest 等)。虽然没有什么可以阻止插件使用这些信息的东西,但它主要用于生成项目文档。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <issueManagement > <system > jira</system > <url > http://jira.baidu.com/nanxs</url > </issueManagement > ... </project >
2、ciManagement——持续集成配置 CI 构建系统配置,主要是指定通知机制以及被通知的邮箱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <ciManagement > <system /> <url /> <notifiers > <notifier > <type /> <sendOnError /> <sendOnFailure /> <sendOnSuccess /> <sendOnWarning /> <address /> <configuration /> </notifier > </notifiers > </ciManagement > ... </project >
3、mailingLists——邮件列表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <mailingLists > <mailingList > <name > Demo</name > <post > nanxs@123.com</post > <subscribe > nanxs@123.com</subscribe > <unsubscribe > nanxs@123.com</unsubscribe > <archive > http:/a.b.c/nanxs/demo/dev/</archive > </mailingList > </mailingLists > ... </project > 复制代码
4、scm——软件配置管理 SCM(软件配置管理,也称为源代码/控制管理或简洁的版本控制)。常见的 scm 有 svn 和 git 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <scm > <connection > scm:svn:http://a.b.com/nanxs</connection > <developerConnection > scm:svn:http://a.b.com/nanxs</developerConnection > <tag /> <url > http://a.b.com/nanxs</url > </scm > ... </project >
5、prerequisites——前提条件 POM 执行的预设条件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <prerequisites > <maven /> </prerequisites > <modules /> <!-格式是<name > value</name > 。 --> <properties /> <reports > </reports > ... </project >
6、repositories——远程仓库列表 repositories
是遵循 Maven 存储库目录布局的 artifacts 集合。默认的 Maven 中央存储库位于https://repo.maven.apache.org/maven2/上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <repositories > <repository > <releases > <enabled /> <updatePolicy /> <checksumPolicy /> </releases > <snapshots > <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots > <id > nanxs-repository-proxy</id > <name > nanxs-repository-proxy</name > <url > http://192.168.1.169:9999/repository/</url > <layout > default</layout > </repository > </repositories > <pluginRepositories > <pluginRepository > ...... </pluginRepository > </pluginRepositories > </project >
7、pluginRepositories——远程仓库列表 与 repositories
差不多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <pluginRepositories > <pluginRepository > ...... </pluginRepository > </pluginRepositories > ... </project >
8、distributionManagement——项目分发信息相关元素 它管理在整个构建过程中生成的 artifact 和支持文件的分布。从最后的元素开始:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <distributionManagement > <repository > <uniqueVersion /> <id > nanxs-maven2</id > <name > nanxsmaven2</name > <url > file://${basedir}/target/deploy</url > <layout /> </repository > <snapshotRepository > <uniqueVersion /> <id > nanxs-maven2</id > <name > Nanxs-maven2 Snapshot Repository</name > <url > scp://svn.baidu.com/nanxs:/usr/local/maven-snapshot</url > <layout /> </snapshotRepository > <site > <id > nanxs-site</id > <name > business api website</name > <url > scp://svn.baidu.com/nanxs:/var/www/localhost/nanxs-web</url > </site > <downloadUrl /> <relocation > <groupId /> <artifactId /> <version /> <message /> </relocation > <status /> </distributionManagement > ... </project >
项目分发信息的相关配置,在distributionManagement中设置。设置的内容包括:
repository和snapshotRepository:项目产生的构建/快照构建部署的远程仓库。如果不配置snapshotRepository,快照也会部署到repository中;
site:部署项目的网站需要的信息;
downloadUrl:项目下载页面的URL,这是为不在仓库中的构建提供的;
relocation:如果构件有了新的group ID和artifact ID(移到了新的位置),这里列出构件的新的信息;
status:给出该构件在远程仓库的状态,本地项目中不能设置该元素,这是工具自动更新的。
9、profiles activation
是一个 profile
的关键。配置文件的功能来自于在某些情况下仅修改基本 POM 的功能。这些情况通过 activation
元素指定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > ... <profiles > <profile > <id /> <activation > <activeByDefault /> <jdk /> <os > <name > Windows XP</name > <family > Windows</family > <arch > x86</arch > <version > 5.1.2600</version > </os > <property > <name > mavenVersion</name > <value > 2.0.3</value > </property > <file > <exists > /usr/local/abcd/abcd-home/jobs/maven-guide-zh-to-production/workspace/ </exists > <missing > /usr/local/abcd/abcd-home/jobs/maven-guide-zh-to-production/workspace/ </missing > </file > </activation > <build /> <repositories /> <pluginRepositories /> <dependencies /> <reporting /> <dependencyManagement /> <distributionManagement /> <reports /> <modules /> <properties /> </profile > </profiles > </project >
Maven 常用 POM 属性
${project.build.sourceDirectory}
:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}
:项目的测试源码目录,默认为 /src/test/java/
${project.build.directory}
:项目构建输出目录,默认为 target/
${project.build.outputDirectory}
:项目主代码编译输出目录,默认为 target/classes/
${project.build.testOutputDirectory}
:项目测试代码编译输出目录,默认为 target/testclasses/
${project.groupId}
:项目的 groupId.
${project.artifactId}
:项目的 artifactId.
${project.version}
:项目的 version,于 ${version}
等价
${project.build.finalName}
:项目打包输出文件的名称,默认为${project.artifactId}${project.version}