119

私はmaven3.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

Maven3.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>

注意:親としてスプリングブートを使用している場合は、代わりに@maven.build.timestamp@を使用する必要があります。また、Spring Bootを使用しMETA-INF/build-info.propertiesている場合は、によってオプションで作成されたファイルがあり、それを読み取るspring-boot-maven-pluginことができます(springは、読み取りに便利なBeanを提供します)。BuildProperties

于 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 に答える