3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

手元にあるjarファイルがどのバージョンのjavaで利用できるのかを調べたい

Posted at

手元にある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

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?