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

kos*_*tja 101 timestamp maven-3 maven

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

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

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

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

kos*_*tja 210

我发现了这篇文章,解释说由于maven中错误,构建时间戳不会传播到过滤.解决方法是将时间戳包装在另一个属性中:

<properties>
   <timestamp>${maven.build.timestamp}</timestamp>
   <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>
Run Code Online (Sandbox Code Playgroud)

然后过滤按预期工作

buildTimestamp=${timestamp}
Run Code Online (Sandbox Code Playgroud)

  • 没有工作.过滤用文字字符串`$ {maven.build.timestamp}`替换`$ {timestamp}`. (13认同)
  • @Betlista是的,eclipse中的服务器集成似乎使用了源目录.这是我放弃eclipse集成并从命令行使用maven的原因之一. (3认同)
  • 如果您使用的是 SpringBoot,则必须编写 `buildTimestamp=@timestamp@` (2认同)

rog*_*ack 7

我可以确认从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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

NB如果你使用Spring作为启动你的父母,你必须使用@ maven.build.timestamp @ 代替。另请注意,如果您使用的是Spring Boot META-INF/build-info.properties,则spring-boot-maven-plugin可以选择读取一个文件,该文件可以读取(Spring提供了一个BuildPropertiesBean,以方便阅读)。

  • 不幸的是,这对于 _maven-war-plugin_ (`&lt;webResources&gt;&lt;resource&gt;&lt;filtering&gt;`) 还不起作用:-(参见 [MWAR-415](https://issues.apache.org/jira/browse/MWAR -415) -&gt; 所以仍然需要使用那里的解决方法 (4认同)
  • 不同的插件的过滤方式不同。如果您在 maven- assembly-plugin v3.3.0 中使用过滤,则 ${maven.build.timestamp} 仍然无法直接使用,您需要使用 `&lt;properties&gt;&lt;timestamp&gt;...` 解决方法。另请参阅 https://issues.apache.org/jira/browse/MASSSEMBLY-603 (2认同)

Bob*_*ers 5

为了丰富 Stackoverflow 的内容,像我一样的人发现这篇文章是解决${maven.build.timestamp}. 这不是 Maven 错误,而是 m2e 的预期行为,如本文所示。

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

就我而言,我所做的是使用插件 ( ),如另一篇文章buildnumber-maven-plugin中所述。