お客の要望で、WAS5で動いているアプリを3.5で動かせないかという話が来て、
その対応のため、稼働中のアプリに入っているjarがどのバージョンでコンパイルされているか調査したのですが、
その時に使ったコードを乗せておきます。
id:shot6さんに、クラスファイルのバイト見ればいいんじゃねと言われたので、jarのなかのクラスファイルの
先頭8バイトを取って、バージョンを出すコードを書いてみました。
import java.io.File; import java.io.FileInputStream; import java.util.jar.JarInputStream; import java.util.zip.ZipEntry; public class ClassVersionCheck { public static void main(String[] args) { try { File libdir = new File("WEB-INF/lib"); File[] libs = libdir.listFiles(); for (int i = 0; i < libs.length; i++) { if (libs[i].getName().endsWith(".jar") || libs[i].getName().endsWith(".zip")) { outputClassVersion(libs[i]); } } } catch (Exception e) { e.printStackTrace(); } } public static void outputClassVersion(File jar) throws Exception { JarInputStream in = new JarInputStream(new FileInputStream(jar)); while (true) { ZipEntry entry = in.getNextEntry(); if (entry == null) break; if (!entry.isDirectory() && entry.getName().endsWith(".class")) { byte[] b = new byte[8]; in.read(b); String version = b[7] + "." + b[5]; String jdkversion = ""; if (version.equals("45.3")) { jdkversion = "JDK1.1"; } else if (version.equals("46.0")) { jdkversion = "JDK1.2"; } else if (version.equals("47.0")) { jdkversion = "JDK1.3"; } else if (version.equals("48.0")) { jdkversion = "JDK1.4"; } else if (version.equals("49.0")) { jdkversion = "Java5"; } else if (version.equals("50.0")) { jdkversion = "Java6"; } else { System.out.println("[UNKNOWN version=" + version + "]:" + jar.getName() + ":" + entry.getName()); continue; } System.out.println("[" + jdkversion + "]:" + jar.getName() + ":" + entry.getName()); } } in.close(); } }
ちなみに調査の結果、すべてのクラスが1.1 or 1.2だったので、ほっと一安心です。