Maven学习笔记之How do I filter resource files

有时资源文件需要包含一个只在编译时才会提供的值。在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>

上面的配置添加了 buildresourcesresource元素。另外,显示的声明了资源文件夹的位置为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.xmlproperties片段中,效果是一样的。(注意,这样就不需要在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.versionuser.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"




http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值