jar をビルドするために使用された Java コンパイラのバージョンを確認するにはどうすればよいでしょうか? jar ファイルがあり、3 つの JDK のいずれかでビルドされた可能性があります。互換性を認定するには、どの JDK でビルドされたかを正確に把握する必要があります。コンパイラのバージョンは、クラス ファイルまたは jar のどこかに埋め込まれていますか?
ベストアンサー1
Ajar
は単なるコンテナです。これは、 または のようなファイル アーカイブですtar
。Azip
のMETA-INFjar
階層内には興味深い情報が含まれている可能性がありますが、そのコンテンツ内のクラスのヴィンテージを指定する必要はありません。そのためには、そこに含まれるファイルを調べる必要があります。class
Peter Lawreyが元の質問へのコメントで述べたように、特定のファイルがどの JDK リリースでビルドされたかを必ずしも知ることはできませんが、に含まれるファイルclass
のバイト コード クラス バージョンを調べることはできます。class
jar
はい、これはちょっと面倒ですが、最初のステップは から 1 つ以上のクラスを抽出することですjar
。例:
$ jar xf log4j-1.2.15.jar
CygwinがインストールされたLinux、Mac OS X、または Windows では、file(1)コマンドはクラスのバージョンを認識します。
$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3
あるいは、javap
@jikes.thunderbolt が適切に指摘しているように、JDK から使用することもできます。
$ javap -v ./org/apache/log4j/Appender.class | grep major
major version: 45
どちらも存在Windows
しない環境の場合file
grep
> javap -v ./org/apache/log4j/Appender.class | findstr major
major version: 45
ちなみに、元の質問よりも、javap
特定のファイルについてずっと多くのことがわかるだろうということには同意します。class
とにかく、別のクラスのバージョン、たとえば:
$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0
以下のリストには、クラス バージョンのメジャー番号と、そのクラス メジャー バージョンが導入された JDK バージョンが表示されます。
注:クラス バージョンは、必ずしもクラスのコンパイルに使用された JDK を識別するわけではありません。クラスを生成した可能性のある最も古いバージョンのみを識別します。
たとえば、クラスのメジャー バージョン 52 は、Java 7 以降のどの JDK でも生成できます。
- 45.3 = Java 1.1
- 46 = Java 1.2
- 47 = Java 1.3
- 48 = Java 1.4
- 49 = Java 5
- 50 = Java 6
- 51 = Java 7
- 52 = Java 8
- 53 = Java 9
- 54 = Java 10
- 55 = Java 11
- 56 = ジャワ 12
- 57 = ジャワ 13
- 58 = ジャワ 14
- 59 = ジャワ 15
- 60 = ジャワ 16
- 61 = ジャワ 17
- 62 = ジャワ 18
- 63 = ジャワ 19
- 64 = ジャワ 20
- 65 = ジャワ 21
- 66 = ジャワ 22