`

再写一遍已经写烂的jar中找冲突类

 
阅读更多

最近因为因为web容器升级,而容器自带了很多jar,发现和应用中的jar有冲突(相同的类,不同的版本),导致出现NoSuchMethon异常什么的。需求来了,需要比较两个目录下有那些相同的类。这个需求前人已经写烂了,可上网搜索一时找不到合适的,就再写了一遍,并作下记录,方便后来人和将来的自己再用。

 

不多说,上代码(一次性代码,1小时搞定,如有编程风格问题,敬请谅解):

 

package com.mikegu.tools.jardiff;

import java.io.File;
import java.io.IOException;

/**
 * 启动入口类
 * 
 * @author haiquan.guhq
 */
public class JarDiffMain {

    /**
     * 输入要比较的两个目录,目录下包含jar,结果输出到控制台。
     */
    public static void main(String[] args) throws IOException {
        if (args.length != 2) {
            System.out.println("please input two compare dirs");
            System.exit(1);
        }
        String firstInputPath = args[0];
        String secondInputPath = args[1];

        File file = new File(firstInputPath);
        File[] listFiles = file.listFiles();
        for (File oneFile : listFiles) {
            if (oneFile.isFile() && oneFile.getAbsolutePath().endsWith(".jar")) {
                String jarName = oneFile.getName();
                ZipDecompression.decompression(oneFile.getAbsolutePath(), firstInputPath + "/tmp/"
                        + jarName); // 解压
                ClassNameFinder.find(jarName, firstInputPath + "/tmp/" + jarName, 1); // 查找
            }
        }

        file = new File(secondInputPath);
        listFiles = file.listFiles();
        for (File oneFile : listFiles) {
            if (oneFile.isFile() && oneFile.getAbsolutePath().endsWith(".jar")) {
                String jarName = oneFile.getName();
                ZipDecompression.decompression(oneFile.getAbsolutePath(), secondInputPath + "/tmp/"
                        + jarName);
                ClassNameFinder.find(jarName, secondInputPath + "/tmp/" + jarName, 2);
            }
        }

        ClassNameFinder.compare();
    }
}

 

 

 

package com.mikegu.tools.jardiff;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

/**
 * 搜索和比较相同的类
 */
public class ClassNameFinder {

    private static Map<String, List<ClassInfosDO>> firstMap  = new HashMap<String, List<ClassInfosDO>>();
    private static Map<String, List<ClassInfosDO>> secondMap = new HashMap<String, List<ClassInfosDO>>();

    public static void find(String jarName, String path, int order) {

        List<String> allClassName = new ArrayList<String>();
        //根据路径取得全类
        getAllClassName(path, allClassName, path.length() + 1);

        if (allClassName != null) {
            for (String one : allClassName) {
                ClassInfosDO classInfosDO = new ClassInfosDO(one, jarName);
                List<ClassInfosDO> list = getOrderMap(order).get(one);
                if (list == null) {
                    List<ClassInfosDO> arrayList = new ArrayList<ClassInfosDO>();
                    arrayList.add(classInfosDO);
                    getOrderMap(order).put(one, arrayList);
                } else {
                    list.add(classInfosDO);
                }
            }
        }

    }

    public static void compare() {
        Set<String> keySet = firstMap.keySet();
        List<String> keyList = new ArrayList<String>();
        keyList.addAll(keySet);
        Collections.sort(keyList);

        Map<String, List<String>> jarViewResult = new TreeMap<String, List<String>>();
        List<String> classViewResult = new ArrayList<String>();

        for (String fullClassName : keyList) {
            List<ClassInfosDO> list = secondMap.get(fullClassName);
            if (list != null) {
                //目录1
                StringBuffer input1SB = new StringBuffer();
                List<ClassInfosDO> value = firstMap.get(fullClassName);
                for (ClassInfosDO oneClassInfosDO : value) {
                    input1SB.append(" " + oneClassInfosDO.getJarName() + ",");
                }

                //目录2
                StringBuffer input2SB = new StringBuffer();
                for (ClassInfosDO oneClassInfosDO : list) {
                    input2SB.append(" " + oneClassInfosDO.getJarName() + ",");
                }

                classViewResult.add(fullClassName + "\tInput1: " + input1SB.toString()
                        + "\t input2: " + input2SB.toString());

                String jarKey = input1SB.toString() + " vs " + input2SB.toString();
                if (jarViewResult.get(jarKey) != null) {
                    jarViewResult.get(jarKey).add(fullClassName);
                } else {
                    List<String> classes = new ArrayList<String>();
                    classes.add(fullClassName);
                    jarViewResult.put(jarKey, classes);
                }
            }
        }

        writeResult(jarViewResult, classViewResult);
    }

    /**
     * 从jar的纬度和class的纬度分别输出结果
     */
    private static void writeResult(Map<String, List<String>> jarViewResult,
                                    List<String> classViewResult) {
        System.out.println("View From jar start.....");
        System.out.println("Total conflict jar num is " + jarViewResult.size());
        Set<Entry<String, List<String>>> entrySet = jarViewResult.entrySet();
        for (Entry<String, List<String>> one : entrySet) {
            String key = one.getKey();
            System.out.println("conflict jar name is" + key);
            for (String oneClassName : one.getValue()) {
                System.out.println("\t\t" + oneClassName);
            }
            System.out.println();
        }

        System.out.println("View From jar end!!!!");

        System.out.println("View From class start.....");
        System.out.println("Total conflict class num is " + classViewResult.size());
        for (String abc : classViewResult) {
            System.out.println(abc);
        }
        System.out.println("View From class end!!!!");
    }

    public static Map<String, List<ClassInfosDO>> getOrderMap(int order) {
        if (order == 1) {
            return firstMap;
        } else {
            return secondMap;
        }
    }

    public static void getAllClassName(String dir, List<String> allClassName, int length) {
        File file = new File(dir);
        File[] listFiles = file.listFiles();
        if (listFiles == null || listFiles.length == 0) {
            return;
        }

        for (File oneFile : listFiles) {
            String absolutePath = oneFile.getAbsolutePath();
            if (oneFile.isDirectory()) {
                getAllClassName(absolutePath, allClassName, length);
            } else {
                if (absolutePath.endsWith(".class")) {
                    allClassName.add(absolutePath.substring(length));
                }
            }
        }

    }

    //    public static void main(String[] args) {
    //        List<String> allClassName = new ArrayList<String>();
    //        getAllClassName("/tmp/1", allClassName, "/tmp/1".length() + 1);
    //        System.out.println(allClassName);
    //        System.out.println(allClassName.size());
    //
    //    }
}

 

 

 

package com.mikegu.tools.jardiff;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class ZipDecompression {
    //    public static void main(String[] args) throws IOException {
    //        String fileName = "toolkit.common.lang-1.0-sources.jar";
    //        decompression("C:/" + fileName, "C:/test");
    //    }

    public static void decompression(String zipFile, String destination) throws IOException {
        ZipFile zip;
        try {
            zip = new ZipFile(zipFile);
        } catch (IOException e) {
            System.out.println("error name " + zipFile);
            throw e;
        }
        Enumeration en = zip.entries();
        ZipEntry entry = null;
        byte[] buffer = new byte[8192];
        int length = -1;
        InputStream input = null;
        BufferedOutputStream bos = null;
        File file = null;

        while (en.hasMoreElements()) {
            entry = (ZipEntry) en.nextElement();
            if (entry.isDirectory()) {
                continue;
            }

            input = zip.getInputStream(entry);
            file = new File(destination, entry.getName());
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            bos = new BufferedOutputStream(new FileOutputStream(file));

            while (true) {
                length = input.read(buffer);
                if (length == -1)
                    break;
                bos.write(buffer, 0, length);
            }
            bos.close();
            input.close();
        }
        zip.close();
    }
}
 

 

package com.mikegu.tools.jardiff;

/**
 * 类信息DO
 */
public class ClassInfosDO {

    private String classFullName;
    private String jarName;

    /**
     * @param classFullName
     * @param jarName
     */
    public ClassInfosDO(String classFullName, String jarName) {
        this.classFullName = classFullName;
        this.jarName = jarName;
    }

    /**
     * @return the classFullName
     */
    public String getClassFullName() {
        return classFullName;
    }

    /**
     * @param classFullName the classFullName to set
     */
    public void setClassFullName(String classFullName) {
        this.classFullName = classFullName;
    }

    /**
     * @return the jarName
     */
    public String getJarName() {
        return jarName;
    }

    /**
     * @param jarName the jarName to set
     */
    public void setJarName(String jarName) {
        this.jarName = jarName;
    }

}
分享到:
评论
1 楼 draem0507 2012-12-24  
看了此文,偶表示一个小时我写不出来,除非有现成的utils类

相关推荐

    jar包冲突检测工具.zip

    它的工作原理可能是通过遍历指定路径下的所有jar文件,然后对比每个jar中的类文件,找出具有相同全限定名(即包括包名和类名)但内容不同的类,从而确定冲突的存在。 `CallJars.exe` 可能是该工具的执行文件,它是...

    检查jar包冲突

    当多个`jar`包引入到同一个项目中时,可能会出现`jar`包冲突问题。这种冲突通常发生在不同`jar`包包含相同类或方法但实现不同的版本时。这种情况可能导致运行时错误、功能缺失或者不可预知的行为。以下是一些关于...

    weblogic部署项目jar冲突解决

    在将一个已经在Tomcat上正常运行的应用迁移到WebLogic时,可能会遇到各种问题,其中最常见的是配置问题和JAR包冲突。 标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能...

    jar包冲突检测工具

    在Java开发过程中,jar包冲突是一个常见的问题,尤其是在大型项目或者依赖复杂的系统中。jar包冲突指的是多个不同的jar包中包含相同类的情况,这可能导致运行时错误或不可预测的行为。"jar包冲突检测工具"正是为了...

    osgi解决不同版本jar包冲突的demo

    OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许在单个JVM上运行多个版本的相同库或服务,从而解决了不同版本jar包冲突的问题。本示例通过一个名为“myself”的工程,展示了如何...

    检测工具 jar包冲突

    在Java开发过程中,"jar包冲突"是一个常见的问题,它主要出现在项目中引用了多个库,而这些库可能包含了相同类的不同版本。这种情况可能导致运行时错误或者程序行为不一致,因为JVM在加载类时可能会遇到混淆。"检测...

    解决jar包冲突的工具类jarjar-1.4.rar

    解决jar包冲突的工具类jarjar-1.4.rar,jar包冲突解决方法,解决jar与jar冲突,jar与aar冲突,不想删除任何一个包,只能修改其中一个jar包包名即可解决,解决方法详细请看这篇文章: ...

    easyExcel、poi,jar包版本冲突,jar包处理

    pom示例:项目中存在冲突再 exclusion 添加即可 &lt;groupId&gt;com.customize&lt;/groupId&gt; &lt;artifactId&gt;easyexcel &lt;version&gt;2.2.6 &lt;groupId&gt;javax.servlet &lt;artifactId&gt;servlet-api 再引用com.customize poi...

    SSH整合jar包,彻底解决集成jar包冲突问题

    5. **合理组织类加载器**:在应用服务器如Tomcat中,可以通过调整类加载策略,比如使用`WEB-INF/classes`优先加载,避免不同模块重复引入的jar包产生冲突。 6. **使用jar包管理工具**:例如,使用FatJar或者One-Jar...

    解决网上应用厅部署在was上jar包冲突问题

    在企业级应用开发与部署的过程中,经常会遇到各种技术挑战,其中之一就是在WebSphere Application Server (WAS) 上部署应用程序时遇到的JAR包冲突问题。这种冲突通常发生在不同组件或者库之间对相同JAR的不同版本有...

    如何在WebSphere中解决jar包冲突.doc

    在大型 Java 软件开发中,jar 包冲突问题是一个常见的问题,系统开发人员经常会为解决类似的问题耗费大量的时间进行调试和测试。为了解决这个问题,本文将从 WebSphere 中类加载器入手,讨论几种解决 jar 包冲突问题...

    websphere下部署CXF项目jar包冲突问题解决方式

    在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件

    asm.jar包冲突

    标题中的“asm.jar包冲突”指的是在开发或运行Java应用程序时遇到的问题,ASM是一个Java字节码操控和分析框架,常用于动态代理、字节码增强等场景。当多个库或者项目引用了不同版本的asm.jar,就可能出现版本冲突,...

    JSONObject所须个包 已解决jar冲突

    1. **排除冲突的类**:正如描述中所述,可以直接删除"commons-beanutils-1.7.0.jar"中的`org/apache/commons/collections`目录及其下的所有class文件。这样可以避免与JSONObject中的类发生冲突。但这样做可能会导致...

    如何在was中解决jar包冲突.pdf

    解决 jar 包冲突问题需要深入了解 WAS 中类加载器的工作机制,并根据实际情况选择合适的解决方法。 本文还详细介绍了 WAS 中类加载器的层次结构,包括 JVM Class loader、WebSphere Extensions Class loader、...

    jarjar-1.4.jar

    在Java开发过程中,我们经常会遇到一个头疼的问题:jar包冲突。这是因为不同的库或者框架可能会包含相同类的不同版本,导致运行时出现错误。为了解决这个问题,开发者们开发了一款名为"jarjar"的工具,其核心功能是...

    关于Myeclipse使用mybatis出现Jar包冲突的解决办法

    本文将针对"关于Myeclipse使用mybatis出现Jar包冲突的解决办法"这一主题,详细解释如何解决这类问题。 首先,我们需要理解为什么会出现Jar包冲突。在MyEclipse中,可能由于内置的库或插件与我们手动引入的库之间...

    邮件开发:javaee.jar mail.jar开发包与javaEE5.0冲突

    这个jar文件通常包含在应用服务器(如Tomcat、Glassfish或JBoss)的类路径中,为开发者提供了一整套开发企业级应用的接口和类。然而,它并不直接包含JavaMail相关的API,这部分功能是由`mail.jar`提供的。 `mail....

Global site tag (gtag.js) - Google Analytics