作成したライブラリのjarに、バージョン情報(および場合によってはjarに関するその他のメタデータ)を追加したいと思います。ただし、使用する属性がわかりません。 仕様 と ドキュメント がSpecification-Version
と Implementation-Version
(および両方のタイトルとベンダー)。しかし、どちらも仕様と実装の違いが何であるかを適切に説明していません。
また、さまざまな例を見ました。
ここでの仕様メタデータと実装メタデータの違いは正確には何ですか?これらの異なる属性(特にバージョン番号)はどのように使用する必要がありますか?仕様のベンダーと実装が異なることはどのように意味がありますか?
それは私がそこに入れたものの役割さえ果たしていますか?
それぞれの意味は Java.lang.Packageのドキュメント で説明されています。
仕様-バージョン は、ASCII桁、ASCIIピリオドで区切る)のシーケンスで構成されている必要があります。他の文字は使用できません。ピリオドは使用できません。値の最初または最後にあり、連続した期間は許可されていません。
Implementation-Version は自由形式の文字列です。任意の形式にすることができます。
仕様-バージョンは常にパッケージに関連付けられています。特定のパッケージではなくマニフェスト全体に指定すると、.jarファイル内のすべてのパッケージに適用されます。
仕様バージョンは、依存関係を解決する手段として、多くのJavaテクノロジによって使用されます。たとえば、バージョン2.1以降のJMFライブラリが必要であるとプログラムが言う場合、一部のJava環境は、一致する仕様タイトルを持つ各マニフェストの仕様バージョンの数値を分析し、実行時にクラスパスで正しいバージョン(および他のバージョンがない)が使用可能であることを確認します。
実際、 Package.isCompatibleWith メソッドはそれを非常にチェックします。最小値をチェックするためにそれを使用することもできますJavaバージョン:
if (System.class.getPackage().isCompatibleWith("1.6")) {
System.out.println("Running in Java 1.6 or later.");
}
上記はJava 9モジュラーアプリケーションでは機能しません。 Java.lang.Packageのドキュメント から:
名前付きモジュールのクラスに対して自動的に定義されたパッケージには、次のプロパティがあります。
…
•仕様と実装のタイトル、バージョン、およびベンダーは指定されていません。名前のないモジュールのクラスに対して自動的に定義されたパッケージには、次のプロパティがあります。
…
•仕様と実装のタイトル、バージョン、およびベンダーは指定されていません。
モジュールとして実行されているJava9プログラムは、代わりに ModuleDescriptor.version() を使用する必要があります。 ModuleDescriptor.Version class は比較可能であることに注意してください。
Module libraryModule = SomeLibraryClass.class.getModule();
Optional<ModuleDescriptor.Version> libraryVersion =
libraryModule.getDescriptor().version();
ModuleDescriptor.Version minimumRequiredVersion =
ModuleDescriptor.Version.parse("2.0");
if (libraryVersion.isPresent() &&
minimumRequiredVersion.compareTo(libraryVersion.get()) >= 0) {
System.out.println(libraryModule + " is version " +
minimumRequiredVersion + " or later.");
}
まあ、仕様はあなたの契約です、例えば:
実装は、まあ、その仕様の実装です。
また、仕様のAPI(したがって仕様バージョン)は変更されない可能性がありますが、バグなどを修正しているため、実装バージョンが変更される可能性があります。
ApacheTomcatのservlet-api.jarマニフェストについて考えてみます。
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.4
Created-By: 1.7.0_40-b43 (Oracle Corporation)
X-Compile-Source-JDK: 1.7
X-Compile-Target-JDK: 1.7
Name: javax/servlet/
Specification-Title: Java API for Servlets
Specification-Version: 3.1
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: javax.servlet
Implementation-Version: 3.1.FR
Implementation-Vendor: Apache Software Foundation
Apacheは、 JCP (Sunによって設立された)によって定義されたサーブレット3.1仕様のいくつかの実装者の1つです。