web-dev-qa-db-ja.com

アプリケーションのバージョンがSpring Boot banner.txtに表示されない

アプリケーションを実行すると、banner.txtで定義されたアプリケーションバージョンがコンソールに表示されません。 Spring Bootのドキュメント に従って定義されます

${application.version}

プロジェクトは、spring-boot-starter-parentを親pomとして使用します( start.spring.io からの基本的なプロジェクトセットアップ)

16
pas2al

OK、プロジェクトをビルドしてJava -jarで実行するとバージョンが印刷されます。ただし、IDE(IntelliJ IDEA)バージョンは印刷されません。

バナーのカスタマイズ のSpring Bootドキュメントによると、${application.version}の値はjarマニフェストから取得されます。

MANIFEST.MFで宣言されているアプリケーションのバージョン番号。たとえば、Implementation-Version:1.0は1.0として印刷されます。

IDEから実行する場合、IDEによってコンパイルされたクラスファイルに対して実行するのが一般的です。 IDEは通常、マニフェストを使用してjar全体をビルドする完全なサイクルを通過しません。したがって、${application.version}の値を置換するMANIFEST.MFは実行時に使用できません。 、そして、あなたは裸のトークンが残っています。

これはコードのバグではなく、完全なjarビルドを行うときに正しく機能することはすでに確認済みです。 IDEを実行中にこれを修正することが本当に重要な場合は、最初に完全なjarビルドとマニフェスト生成を実行するカスタムビルドステップのセットアップを検討できます。おそらくそれはやり過ぎです。バナーは、jarの実際のリリースビルドに対してテストすることで、後でIDEの外側で検証できます。

19
Chris Nauroth

私の場合、spring-boot-maven-pluginによって作成されたマニフェストの内部を調べましたが、内部にImplementation-versionはありませんでした。

追加するには、pom.xmlのbuild.pluginsセクションにプラグインmaven-jar-pluginを追加します。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
         <archive>
              <manifestEntries>
                    <Implementation-Version>${project.version}</Implementation-Version>
              </manifestEntries>
         </archive>
    </configuration>
</plugin>

その後、すでに述べたように、Java -jar et ide ideではなく、

5
bolivier

参考までに、Gradleベースのプロジェクトを使用したSpring Boot 2(Spring Boot Gradleプラグインを使用)でコマンドライン用が機能することがわかりました。 Intellijのコンソールはまだ動作しませんが、それは 問題は数年前から存在していました

標準の2.0.5.RELEASE build.gradlejarタスクを使用しても機能しませんでした、 bootJarタスクが優先されるため

デフォルトでは、bootJarまたはbootWarタスクが構成されている場合、jarまたはwarタスクは無効になっています。

だから私はbootJarタスクを試してみましたが、それは動作します:

version = '0.0.1-SNAPSHOT'

bootJar {
    mainClassName = 'com.demo.Application'
    manifest {
        attributes('Implementation-Title':   'Demo Application',
                   'Implementation-Version': version)
    }
}

注:mainClassNameとそれに相当するものは必要ありません メインクラスが1つしかない場合 。検出または構成されたメインクラスは、「開始クラス」としてMANIFEST.MFに自動的に追加されます。

これが機能するようになったら、通常どおり Spring Boot banner.txtファイル${application.title}${application.version}を使用できます。

1
ben3000

別の解決策:

Mavenリソースプラグインを使用して、リソースファイルのプロパティを「フィルター」(置換)します。

Pomで、次の定義を使用してリソースフィルタリングをアクティブにします。

<resources>
    <resource>
        <filtering>true</filtering>
        <directory>src/main/resources</directory>
        <includes>
            <include>application.properties</include>
        </includes>
    </resource>
</resources>

Application.propertiesファイルで:

[email protected]@
[email protected]@

Banner.txtファイルで:

${info.app.name} (${info.app.version})
0

私にとっては、mvnビルドのテキストを次のように完全に置き換えます:

com.google.code.maven-replacer-plugin

  <plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
      <execution>
        <phase>prepare-package</phase>
        <goals>
          <goal>replace</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <file>target/classes/banner.txt</file>
      <replacements>
        <replacement>
          <token>application.title</token>
          <value>${artifactId}</value>
        </replacement>
        <replacement>
          <token>application.version</token>
          <value>${version}</value>
        </replacement>
      </replacements>
    </configuration>
  </plugin>

はい、banner.txtから$ {}を削除しました

0
NotLikeNames

基本的に、$ {application.title} $ {application.formatted-version}の値は、パッケージ化されたjarファイルのマニフェストファイルから選択されます。そのため、プロジェクトのビルドライフサイクル中に実際に印刷できるかどうかはわかりません。 ここにリンクの説明を入力してください

以下の例を参照できます

0
ManjuGH