リソースフィルタリングのためにmaven.build.timestampにアクセスする方法


107

私はmaven 3.0.4を使用しており、アプリケーションからビルドタイムスタンプにアクセスできるようにしたいと考えています。このために、プレースホルダーを.propertiesファイルに入れて、ビルド時にmavenフィルターをかけます。これがために正常に動作している間に${project.version}${maven.build.timestamp}フィルタリングに置換されていません。

プロパティはビルド時に使用できるようです-私はそれを使用してアーティファクト名を変更できます:

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

では、なぜリソースフィルタリングに使用できないのでしょうか。そして、もっと重要なことは、どうすればそれをアクセシブルにするのか?

回答:


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

3
@Betlistaええ、Eclipseのサーバー統合はソースディレクトリを使用しているようです。これが、Eclipseの統合をやめ、コマンドラインからmavenを使用する理由の1つでした。
Kostja 2013年

1
pomにタイムスタンプが必要な複数の場所があるが、形式が異なる(ファイル名とビルド時の文字列など)場合、maven.build.timestamp.format複数回使用するにはどうすればよいですか?
Daniel Alder、

13
役に立たない。フィルタリングは${timestamp}リテラル文字列に置き換えられます${maven.build.timestamp}
Kevin Krumwiede 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 ex)。

<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可能なによって作成されたファイルがあることに注意してください(Springは、読み取りに便利なBeanを提供します)。BuildProperties


1
残念ながら、これはまだmaven-war-plugin<webResources><resource><filtering>)では機能しません:-( MWAR-415を参照してください->したがって、そこで回避策を使用する必要があります
msa

1
プラグインが異なると、フィルタリングも異なります。maven-assembly-plugin v3.3.0内でフィルタリングを使用する場合、$ {maven.build.timestamp}はまだ直接利用できないため、<properties><timestamp>...回避策を使用する必要があります。issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso

4

Stackoverflowのコンテンツを私と同じように充実させるために、この投稿はの「問題」を解決する方法として発見されました${maven.build.timestamp}。これはMavenのバグではありませんが、この投稿でわかるように、m2eの予想される動作です。

したがって、私が理解しているところによると、修正には概念的な問題が含まれているため、ソリューションが「修正」されることは期待できません。

私の場合、私がしたことはbuildnumber-maven-plugin、この別の投稿で説明されているようにプラグイン()を使用することでした。


buildnumber-maven-plugin同様の問題があることがわかりました。つまり、それが生成する変数は、フィルタリングではなく、特定のコンテキストでのみ使用可能です。実行フェーズまたは目標をいじくり回すことでこれを克服できる場合とできない場合がありますが、組み込みのソリューションの方がはるかに簡単に見えます。
MarkHu 2017

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}

その後、このプロパティファイルをアプリケーションにロードできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.