首页 » Maven实战 » Maven实战全文在线阅读

《Maven实战》14.1 Maven属性

关灯直达底部

前面的章节已经简单介绍过Maven属性的使用,例如在5.9.2节有如代码清单14-1所示的代码。

代码清单14-1 使用Maven属性归类依赖

这可能是最常见的使用Maven属性的方式,通过<properties>元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名称}的方式引用该属性,这种做法的最大意义在于消除重复。例如,代码清单14-1中本来需要在多个地方重复声明同样的SpringFramework版本,现在只在一个地方声明就可以,重复越多,好处就越明显。因为这样不仅减少了日后升级版本的工作量,也能降低错误发生的概率。

这不是Maven属性的全部,事实上这只是6类Maven属性中的一类而已。这6类属性分别为:

·内置属性:主要有两个常用内置属性——${basedir}表示项目根目录,即包含pom.xml文件的目录;${version}表示项目版本。

·POM属性:用户可以使用该类属性引用POM文件中对应元素的值。例如${project.artifactId}就对应了<project><artifactId>元素的值,常用的POM属性包括:

■${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/。

■${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/。

■${project.build.directory}:项目构建输出目录,默认为target/。

■${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/。

■${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes/。

■${project.groupId}:项目的groupId。

■${project.artifactId}:项目的artifactId。

■${project.version}:项目的version,与${version}等价。

■${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}。

这些属性都对应了一个POM元素,它们中一些属性的默认值都是在超级POM中定义的,可以参考8.5节。

·自定义属性:用户可以在POM的<properties>元素下自定义Maven属性。例如:

然后在POM中其他地方使用${my.prop}的时候会被替换成hello。

·Settings属性:与POM属性同理,用户使用以settings.开头的属性引用settings.xml文件中XML元素的值,如常用的${settings.localRepository}指向用户本地仓库的地址。

·Java系统属性:所有Java系统属性都可以使用Maven属性引用,例如${user.home}指向了用户目录。用户可以使用mvn help:system查看所有的Java系统属性。

·环境变量属性:所有环境变量都可以使用以env.开头的Maven属性引用。例如${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。用户可以使用mvn help:system查看所有的环境变量。

正确使用这些Maven属性可以帮助我们简化POM的配置和维护工作,下面列举几个常见的Maven属性使用样例。

在一个多模块项目中,模块之间的依赖比较常见,这些模块通常会使用同样的groupId和version。因此这个时候就可以使用POM属性,如代码清单14-2所示。

代码清单14-2 使用POM属性配置依赖

在代码清单14-2中,当前的模块依赖于account-email和account-persist,这三个模块使用同样的groupId和version,因此可以在依赖配置中使用POM属性${project.groupId}和${project.version},表示这两个依赖的groupId和version与当前模块一致。这样,当项目版本升级的时候,就不再需要更改依赖的版本了。

大量的Maven插件用到了Maven属性,这意味着在配置插件的时候同样可以使用Maven属性来方便地自定义插件行为。例如从10.6节我们知道,maven-surefire-plugin运行后默认的测试报告目录为target/surefire-reports,这实际上就是${project.build.directory}/surefire-reports,如果查阅该插件的文档,会发现该插件提供了reportsDirectory参数来配置测试报告目录。因此如果想要改变测试报告目录,例如改成target/test-reports,就可以像代码清单14-3这样配置。

代码清单14-3 使用Maven属性配置插件

从上面的内容中可以看到,Maven属性能让我们在POM中方便地引用项目环境和构建环境的各种十分有用的值,这是创建灵活构建的基础。下面将会结合profile和资源过滤,展示Maven能够为构建提供的更多的可能性。