有时资源文件需要包含一个只在编译时才会提供的值。在Maven中为了做到这点,可以使用语法${<property name>}来引用property,使其包含进你的资源文件中。property可以是定义在pom.xml、user‘s settings.xml、定义于外部properties文件或系统property中的值。
为了让Maven在复制资源时能过滤,只需要在pom.xml中将对应资源目录的filtering设置为true。
<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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<strong> <build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build></strong>
</project>
上面的配置添加了
build、
resources和
resource元素。另外,显示的声明了资源文件夹的位置为src/main/resources。这些信息都有默认值,但是
filtering的默认值是false。上述的配置覆盖了原来的默认值,并把
filtering设置为了true。
为了引用定义在pom.xml中的property,property的名字使用XML的元素名,“pom”允许作为project(root)元素的别名。因此${pom.name}引用的是项目的名字,${pom.version}引用的是项目的版本号,${pom.build.finalName}引用的是项目编译打包后最终的文件名。值得注意的是POM中的一些元素是有默认值的,因此即使没有在pom.xml中显示定义也是可以使用的。类似的,user's settings.xml中的值也能被引用,property名字以“settings”打头(例如${settings.localRepository}引用的是用户本地仓库的路径)。
继续我们的例子,添加两个属性到application.properties文件中(该文件放在src/main/resources文件夹下),当资源被过滤时其中的值就会被替换。
# application.properties
application.name=${pom.name}
application.version=${pom.version}
执行以下命令(process-resources是编译时的生命阶段,此时资源被复制和过滤)
mvn process-resources
在target/classes文件夹下的application.properties(最终会被打包到jar文件中),则是这样的:
# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT
要引用来自外部文件的property,只需要在pom.xml中添加该外部文件的说明。首先,创建一个外部的properties文件
src/main/filters/filter.properties:
# filter.properties
my.filter.value=hello!
接着,在pom.xml中添加对该新文件的引用:
<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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<strong><filters>
<filter>src/main/filters/filter.properties</filter>
</filters></strong>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
接着,我们在
application.properties文件中添加对该属性的引用:
# application.properties
application.name=${pom.name}
application.version=${pom.version}
message=${my.filter.value}
接着执行
mvn process-resources命令就会把新的属性值加入
application.properties中。除了将my.filter.value属性定义在外部文件外,也可以将它定义在
pom.xml的
properties片段中,效果是一样的。(注意,这样就不需要在pom.xml中引入
src/main/filters/filter.properties的引用):
<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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<strong> <properties>
<my.filter.value>hello</my.filter.value>
</properties></strong>
</project>
资源过滤时也可以从系统属性中获取值。包括内建于Java的系统属性(像
java.version或
user.home)或通过标准Java -D参数在命令行中定义的属性。修改
application.properties文件为:
# application.properties
java.version=${java.version}
command.line.prop=${command.line.prop}
现在当你执行以下命令时(注意命令行中的属性定义),
application.properties文件将会包含从系统属性获得的值。
mvn process-resources "-Dcommand.line.prop=hello again"