手元にあるjarファイルがどのバージョンのjavaで利用できるのかを調べるにはどうすればよいでしょうか?
実をいうと、jarファイルそのものはビルドのバージョンを有していません。jarファイルというのはclassファイルやpropertiesファイルやそのほかファイルをアーカイブしたものにすぎません。たとえるなら、jarはtarやzipの親戚とでもいえばよいでしょうか。したがって、Javaの特定のバージョンでそのjarファイルが利用可能かどうかを調べるには、jarファイルそのもののバージョンではなく、そのjarファイルに格納されているclassファイルがどのバージョンのjavacでビルドされたのかを見てやる必要があります。
ここでは調査方法の例としてcommons-collections4-4.4.jar
(Apache Commons Collections v.4.4) がどのバージョンから利用できるのかを調査してみます。
まずjar
コマンドでjarファイルの中身を取り出します。
$ jar xf commons-collections4-4.4.jar
するとjarファイルに格納されていたclassファイルが複数見つかるはずです。ここではサンプルとして、./org/apache/commons/collections4/ArrayStack.class
を利用することにします。
$ find . -name "*.class" | head -n1
./org/apache/commons/collections4/ArrayStack.class
./org/apache/commons/collections4/ArrayStack.class
がどのバージョンのjavacによりビルドされたのかを調べたいわけですが、まず手っ取り早いのがfile
コマンドを利用する方法です。この場合はJava8でビルドされていることが一目瞭然ですね。
$ file ./org/apache/commons/collections4/ArrayStack.class
./org/apache/commons/collections4/ArrayStack.class: compiled Java class data, version 52.0 (Java 1.8)
file
コマンドがない環境ではjavap
を利用しましょう。
$ javap -v ./org/apache/commons/collections4/ArrayStack.class | grep major
major version: 52
javap
はclassファイルを逆アセンブルするコマンドで、-v
オプションを付けると詳細情報が出力され、その中にバージョン情報が混ざっています。これをgrep
でより分けているわけですね。ここで表示されているmajor version: 52
という値はJava8を指しています。このmajor version
とJavaのバージョンの対応関係については、次のページがよくまとまっているので、参考にしてください → Wikipedia: Java class file