补丁总是会一遍又一遍的打,越打越多
有时候,就担心有人不小心把高版本的class打到低版本jre运行的环境中
简单写了点代码,检查文件夹中class的版本号
package org.wee.cv; import java.io.File; import java.io.FileInputStream; public class ClassVersion { /** * 检查class文件的版本号 * @param classFile * @return * 返回值为:JDK1.4 JDK1.5 ... 或者unknown * @throws Exception */ public static String checkClassVersion(File classFile) throws Exception{ byte[] data = new byte[8]; FileInputStream in = new FileInputStream(classFile); //读取文件前8字节 //实际上版本号写在第4-7字节上(从第0字节开始算) in.read(data, 0, 8); in.close(); //计算出class文件的主次版本号 int minor_version = (((int)data[4])<<8)+data[5]; int major_version = (((int)data[6])<<8)+data[7]; return translateVersionToJDK(major_version); } /** * 根据主版本号,转换成JDK版本 * 48是JDK1.4,49是JDK1.5,依次类推 * @param major_version * @return */ public static String translateVersionToJDK(final int major_version){ switch(major_version){ case 48: return "JDK1.4"; case 49: return "JDK1.5"; case 50: return "JDK1.6"; case 51: return "JDK1.7"; default: return "unknown"; } } }
package org.wee.cv; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class BatchClassVersionCheck { public static void main(String[] args) { try { BatchClassVersionCheck bcvc = new BatchClassVersionCheck(); HashMap<String,List<String>> versionMap = bcvc.getDirectoryClassVersionInfo(new File("D:/test")); for (String version : versionMap.keySet()){ System.out.println("version:" + version); List<String> list = versionMap.get(version); for (String file : list){ System.out.println(file); } } } catch (Exception e) { e.printStackTrace(); } } //保存文件夹中的class文件版本信息 //key是版本号 //value是对应文件的绝对路径 private HashMap<String,List<String>> classVersionInfoMap; /** * 获取文件夹中class类的版本信息 * @param dir * @return * @throws Exception */ public HashMap<String,List<String>> getDirectoryClassVersionInfo(File dir) throws Exception{ classVersionInfoMap = new HashMap<String,List<String>>(); searchClass(dir); return classVersionInfoMap; } /** * 递归方法 * 搜索当前文件夹下的class文件,并计算版本信息,保存在map中 * 当搜索到文件夹时,递归搜索 * @param dir * @throws Exception */ protected void searchClass(File dir) throws Exception{ File[] childFiles = dir.listFiles(); for (File childFile : childFiles){ if (childFile.isDirectory()){ //递归搜索子文件夹 searchClass(childFile); } else{ if (childFile.getName().toLowerCase().endsWith(".class")){ //搜索出class文件 //将版本信息记录在map中 putVersionInfo(ClassVersion.checkClassVersion(childFile), childFile.getAbsolutePath()); } } } } /** * 将版本信息记录在map中 * @param version * @param absolutePath */ private void putVersionInfo(String version,String absolutePath){ List<String> list = null; if (classVersionInfoMap.containsKey(version)){ list = classVersionInfoMap.get(version); } else{ list = new ArrayList<String>(); } list.add(absolutePath); classVersionInfoMap.put(version, list); } }