如何访问maven.build.timestamp以进行资源过滤

时间:2012-11-05 08:35:38

标签: maven timestamp maven-3

我正在使用maven 3.0.4,并希望我的应用程序可以访问构建时间戳。为此,我将占位符放在.properties文件中,让maven过滤构建。虽然这适用于${project.version},但${maven.build.timestamp}未在过滤时替代。

该属性似乎在构建时可用 - 我可以使用它来修改工件名称:

<finalName>${project.artifactId}-${maven.build.timestamp}</finalName>

那为什么它不能用于资源过滤?而且,更重要的是,我如何让它可以访问?

4 个答案:

答案 0 :(得分:201)

我发现this article,解释由于bug in maven,构建时间戳不会传播到过滤。解决方法是将时间戳包装在另一个属性中:

<properties>
   <timestamp>${maven.build.timestamp}</timestamp>
   <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>

过滤然后按预期工作

buildTimestamp=${timestamp}

答案 1 :(得分:2)

为了丰富其他人的Stackoverflow内容,像我一样,发现这篇文章是解决问题的一种方法。 ${maven.build.timestamp}。这不是maven bug,而是m2e的预期行为,如this post中所示。

因此,我认为我们不能指望解决方案得到纠正&#34;,因为根据我的理解,纠正涉及概念问题。

在我的情况下,我所做的是使用此other post中所述的插件(buildnumber-maven-plugin)。

答案 2 :(得分:2)

我可以确认从Maven 3.x {maven.build.timestamp}开始正在运行。他们work arounded显然是问题所在。不再需要其他properties

但是,请注意您的“过滤”插件(maven-resources-plugin)是最新的。它必须是相对较新的,所以如果mvn help:effective-pom显示的是旧版本(例如2.6),请将其更改为较新的版本,并为我修复3.x,例如:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.1.0</version>
</plugin>

<properties><timestamp>...不再需要解决方法...

这也弄清了为什么它可以在IntelliJ中运行,但不能在命令行中运行。 IntelliJ可能使用自己的“修改后的/内部” maven常量,因此它在那里工作,但不是从maven命令行运行。

还请注意,如果您向pom添加了过滤资源目录,则可能还需要“重新添加”默认目录,它会丢失,例如:

  <resource>
    <directory>src/main/resources-filtered</directory> <!-- to get "maven.build.timestamp" into resource properties file -->
    <filtering>true</filtering>
  </resource>
  <resource>
    <directory>src/main/resources</directory> <!-- apparently have to add this is you have the other... -->
  </resource>

注意,如果您使用Spring Boot作为父母,则必须使用@ maven.build.timestamp @ instead。还要注意,如果您使用的是Spring Boot,则有一个文件META-INF/build-info.propertiesspring-boot-maven-plugin创建,您可以read创建文件(spring提供了一个BuildProperties bean,以方便阅读)。

答案 3 :(得分:0)

在pom项目级别添加Maven属性时未考虑正确的本地时区,因此时间戳可能显示错误:

<properties><timestamp>${maven.build.timestamp}</timestamp></properties>

使用build-helper-maven-plugin将正确的时区和当前的夏时制应用于时间戳:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.9.1</version>
            <executions>
                <execution>
                    <id>timestamp-property</id>
                    <goals>
                        <goal>timestamp-property</goal>
                    </goals>
                    <configuration>
                        <name>timestamp</name>
                        <pattern>yyyy-MM-dd HH:mm:ss</pattern>
                        <timeZone>Europe/Zurich</timeZone>
                    </configuration>
                </execution>
            </executions>
        </plugin>
     </plugins>
     <resources>
         <resource>
             <directory>src/main/resources</directory>
             <filtering>true</filtering>
         </resource>
     </resources>
 </build>

打包时,Maven将替换/ resources文件夹中的所有令牌时间戳,例如resources / version.properties:

build.timestamp = $ {timestamp}

然后可以在应用程序中加载此属性文件。