119

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

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

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

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

4

4 回答 4

240

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

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

然后过滤按预期工作

buildTimestamp=${timestamp}
于 2012-11-05T09:04:29.720 回答
19

我可以确认 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.build.timestamp@代替。另请注意,如果您使用的是 Spring Boot META-INF/build-info.properties,则可以选择由spring-boot-maven-plugin您可以读取BuildProperties的文件创建一个文件(为了方便阅读,Spring 提供了一个bean)。

于 2018-10-23T00:07:14.863 回答
4

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

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

就我而言,我所做的是使用其他帖子buildnumber-maven-plugin中描述的插件 () 。

于 2015-02-06T12:06:54.773 回答
4

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

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

于 2019-01-28T08:13:58.353 回答