补丁总是会一遍又一遍的打,越打越多
有时候,就担心有人不小心把高版本的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);
- }
- }