Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

Package#getImplementationVersion​() の戻り値(Java)

Java 9 で Package#getImplementationVersion​() の動作確認をしたら、マニフェストファイル内の実装バージョンを返却してくれませんでした。

他の Java バージョンでも動作確認をしたので、その内容を記載していきます。

1. 動作確認

1.1. マニフェストファイル

動作確認用のマニフェストファイルは以下の通りです。

MANIFEST.MF

Manifest-Version: 1.0
Implementation-Version: 1.0.0
Build-Jdk-Spec: 1.8
Created-By: Maven JAR Plugin 3.3.0
Main-Class: org.sample.ver.Main

実装バージョンの値は 1.0.0 です。

1.2. 確認結果

メソッドの戻り値は以下の通りでした。

Java 戻り値 JDK ベンダー
9 null Oracle
8(LTS) 1.0.0 Oracle, Amazon
11(LTS) 1.0.0 Amazon
17(LTS) 1.0.0 Amazon

Java 8 だけ Oracle JDKAmazon Corretto で検証しました。

2. 動作確認用アプリ

動作確認用のアプリは Java 8 でビルドしました。

2.1. ビルドファイル

Maven のビルドファイルは以下の通りです。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.sample</groupId>
  <artifactId>impl-ver</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>org.sample.ver.Main</mainClass>
            </manifest>
            <manifestEntries>
              <Implementation-Version>${project.version}</Implementation-Version>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

JAR プラグインマニフェストファイルを生成しています。

2.2. プログラム

メソッドの戻り値を出力するコードを作成しました。

src/main/java/org/sample/ver/Main.java

package org.sample.ver;

public class Main {
  public static void main(String[] args) {
    System.out.println(
      Main.class.getPackage().getImplementationVersion()
    );
  }
}

2.3. ビルドコマンド

以下のコマンドで jar を作成しました。

mvn clean package

2.4. アプリの実行

target フォルダで以下のコマンドを実行しました。

java -jar impl-ver-1.0.0.jar

3. Package クラスの仕様

Package クラスの JavaDoc を見ると、マニフェストファイルの情報を返すとは書かれていませんでした。

4. バージョンの持ち方について

もしかしたら、アプリのソース内やプロパティファイルでバージョンを保持したほうが安全なのかもしれません。

4.1. Tomcat の場合

Tomcat のソースを見たところ、プロパティファイルからバージョンを取得していました。

tomcat/ServerInfo.java - GitHub