如何在资源文件中读取Maven相关的参数

pom resources

首先要为pom文件新添一个resources标签

<project>
    <name>...</name>
    <groupId>...</groupId>
    <version>...</version>
    ...
    
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <filtering>true</filtering>
        </resources>
    </build>
</project>

默认情况下<filtering>的属性为false,因此需要申明来覆盖它。resource的directory标签申明了资源的路径,代表该路径下的资源都可以通过@property@(注意是被@包裹)的方式来访问以下相关的属性:

  • pom中的属性,例如:@project.name@ @project.version@ @project.build.finalName@
  • settings.xml中的属性,例如:@settings.localRepository@
  • 系统属性,例如: @java.version@ @user.home@
#application.properties
application.name=@project.name@
application.version=@project.version@
java.version=@java.version@

以上的属性引用,都会在mvn build阶段通过mvn process-resources语句处理为实际的值。手动执行完mvn process-resources命令,在target/classes下的资源就会变成这样:

#application.properties
application.name=test
application.version=1.1
java.version=1.8

除了系统中已经定义好的属性,你还可以自定义属性

外部文件属性

定义一个外部属性文件src/main/filters/filter.properties

# filter.properties
my.filter.value=hello!

要访问这个属性文件,需要更改pom文件build块的内容:

<build>
    <filters>
      <filter>src/main/filters/filter.properties</filter>
    </filters>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>

相比之前的build,增加了一个filters标签,将自定义属性文件的路径作为子标签的属性。这样在src/main/resources路径下的资源文件中就可以直接访问了:

#application.properties
application.name=@project.name@
application.version=@project.version@
java.version=@java.version@
my.filter.value=@my.filter.value@

pom properties

pom文件中的properties属性,不仅在pom文件中能调用,在外部资源文件中也能像前面那样调用。

<project>
    <name>...</name>
    <groupId>...</groupId>
    <version>...</version>
    ...
    
    <properties>
        <my.property>myProperty</my.property>
    </properties>
    
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <filtering>true</filtering>
        </resources>
    </build>
</project>
#application.properties
application.name=@project.name@
application.version=@project.version@
java.version=@java.version@
my.filter.value=@my.filter.value@
my.property=@my.property@

命令行属性

跟在mvn后面的属性参数,也能在src/main/resources目录中的资源文件中调用:

mvn package "-Dmy.command.property=commandProperty"

规则就是在-D后边加上属性键值对(key=value)

#application.properties
application.name=@project.name@
application.version=@project.version@
java.version=@java.version@
my.filter.value=@my.filter.value@
my.property=@my.property@
my.command.property=@my.command.property@

加载外部文件的属性

可以通过加载外部属性文件,扩展Maven可用的属性值。

<project>
  ...
  <name>My Resources Plugin Practice Project</name>
  ...
  <build>
    ...
    <filters>
      <filter>[a filter property]</filter>
    </filters>
    ...
  </build>
  ...
</project>

my-filter-values.properties包含以下属性:

your.name = world

可以加载到pom.xml中:

 ...
    <filters>
      <filter>my-filter-values.properties</filter>
    </filters>
 ...

这样就可以通过${your.name}来访问该属性值