如何访问资源过滤的 maven.build.time戳

我使用的是 maven 3.0.4,希望我的应用程序能够访问构建时间戳。为此,我将在 .properties文件中放置一个占位符,并让 maven 在构建时进行过滤。虽然这对于 ${project.version}来说工作得很好,但是在过滤时 ${maven.build.timestamp}并没有被取代。

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

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

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

95384 次浏览

我已经发现了 这篇文章,解释说由于 Maven 里的窃听器的原因,构建时间戳不会传播到过滤器。解决方案是将时间戳封装在另一个属性中:

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

然后,过滤工作正如预期的那样

buildTimestamp=${timestamp}

为了丰富其他人的堆栈溢出内容,那些像我一样的人,发现了这个帖子作为一种解决 ${maven.build.timestamp}“问题”的方法。这不是一个 maven 错误,而是 m2e 的预期行为,正如在 这篇文章中所看到的那样。

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

在我的例子中,我所做的就是使用这个 other post中描述的插件(buildnumber-maven-plugin)。

我可以确认 Maven 3. x {maven.build.timestamp}现在是“正常工作”的。他们 周围的工作的问题,显然。不再需要额外的 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。时间戳@取而代之。还要注意,如果您使用的是 spring boot,那么有一个由 spring-boot-maven-plugin创建的 META-INF/build-info.properties文件,您可以使用 (spring 提供了一个 BuildProperties bean,以方便读取它)。

在 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:

Timestamp = ${ timestamp }

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