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 JDK と Amazon 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>
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 のソースを見たところ、プロパティファイルからバージョンを取得していました。