web-dev-qa-db-ja.com

JARマニフェストファイル-仕様と実装の違い

作成したライブラリのjarに、バージョン情報(および場合によってはjarに関するその他のメタデータ)を追加したいと思います。ただし、使用する属性がわかりません。 仕様ドキュメントSpecification-VersionImplementation-Version(および両方のタイトルとベンダー)。しかし、どちらも仕様と実装の違いが何であるかを適切に説明していません。

また、さまざまな例を見ました。

  • documentation のものは、仕様タイトルに人間が読める形式の名前を使用し、実装タイトルにパッケージ名を使用します。ドットで区切られたバージョン番号は仕様バージョンに使用され、単純なビルド番号は実装バージョンに使用されます。
  • Gradleチュートリアルでは、Implementation-Versionと、Implementation-Titleに人間が読める文字列を使用しているようです。
  • 別の質問 で、さまざまなパッケージの実装バージョンがいくつかある例を見つけました。

ここでの仕様メタデータと実装メタデータの違いは正確には何ですか?これらの異なる属性(特にバージョン番号)はどのように使用する必要がありますか?仕様のベンダーと実装が異なることはどのように意味がありますか?

それは私がそこに入れたものの役割さえ果たしていますか?

16
Joachim Kurz

それぞれの意味は 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.");
}
12
VGR

まあ、仕様はあなたの契約です、例えば:

  • jAXB、JDBC、またはさまざまなJava EE標準(EJB 2.x、EJB 3.0、EJB 3.1など)のいずれか)などの標準
  • ライブラリ、フレームワーク、またはサービスへのAPI

実装は、まあ、その仕様の実装です。

また、仕様のAPI(したがって仕様バージョン)は変更されない可能性がありますが、バグなどを修正しているため、実装バージョンが変更される可能性があります。

6
Puce

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つです。

3
McDowell