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


107

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

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

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

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

Answers:


220

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

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

然后过滤将按预期工作

buildTimestamp=${timestamp}

1
只是给其他人的说明,我对此有问题,因为我在Eclipse中使用Tomcat,而且看起来工作不正常-可以在target/${project}文件夹中进行替换,但是在我的实际配置中Tomcat没有使用此文件夹...
Betlista 2013年

3
@Betlista是的,eclipse中的服务器集成似乎使用了源目录。这是我放弃Eclipse集成并从命令行使用maven的原因之一。
kostja 2013年

1
给定pom中有多个需要时间戳的地方,但是格式不同(例如文件名和构建时间字符串),我该如何maven.build.timestamp.format多次使用?
Daniel Alder 2014年

13
没有工作 过滤将替换${timestamp}为文字字符串${maven.build.timestamp}
凯文·克鲁姆维德2014年

1
如果您使用的是SpringBoot,则必须编写buildTimestamp=@timestamp@
Julien Feniou,

10

我可以确认从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>

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


1
不幸的是,这对于maven-war-plugin<webResources><resource><filtering>)仍然不起作用:-(请参阅MWAR-415- >因此仍然必须在此处使用变通方法
msa

1
不同的插件会进行不同的过滤。如果在maven-assembly-plugin v3.3.0中使用过滤,则$ {maven.build.timestamp}仍然不直接可用,您需要使用<properties><timestamp>...变通方法。另请参见issue.apache.org/jira/browse/MASSEMBLY-603
Cheeso

4

为了丰富像我这样的其他人的Stackoverflow内容,发现了这篇文章是解决的“问题”的一种方法${maven.build.timestamp}。这不是一个Maven的错误,但M2E的预期行为,如中可以看到这个帖子

因此,我相信我们不能指望解决方案会被“纠正”,因为据我所知,纠正涉及概念性问题。

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


我发现buildnumber-maven-plugin有类似的问题,即它生成的变量仅在某些情况下可用,而没有过滤。通过修改执行阶段或目标,您也许可以克服,也可能无法克服,但是内置解决方案似乎要简单得多。
MarkHu

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.