【问题标题】:Elegant way to compare the content of JARs (to find new classes and methods)比较 JAR 内容的优雅方式(查找新的类和方法)
【发布时间】:2011-08-18 07:01:54
【问题描述】:

是的,互联网上说-“将它们全部解压缩,反编译并使用某些工具(total comander,WinCompare,meld(linux)等)比较代码...)我需要一个工具来自动生成差异报告的原因来自 Fodler1 和 Folder2 很简单 - 这些文件夹中有太多 JAR,我需要比较这些文件夹(与下一个版本的 Jar)一个月内说 1 次。所以,我真的不想手动进行!

让我们看看到目前为止我得到了什么:

1) 我可以在每个文件夹中找到所有 JAR :)

2) 我可以从每个 JAR 中获取类列表:

private static void AddAllClassesFromJAR(JarInputStream jarFile,
        ArrayList<String> classes) throws IOException {
    JarEntry jarEntry = null;
    while (true) {
        jarEntry = jarFile.getNextJarEntry();
        if (jarEntry == null) {
            break;
        }
        if (jarEntry.getName().endsWith(".class")) {
            classes.add(jarEntry.getName());
        }
    }
}

    public static List<String> getClasseNamesInPackage(String jarName) {
    ArrayList<String> classes = new ArrayList<String>();
    try {
        JarInputStream jarFile = new JarInputStream(new FileInputStream(jarName));
        AddAllClassesFromJAR(jarFile, classes);
    } catch (Exception e) {
        e.printStackTrace();
    }
        return classes;
    }

3) Java 中有反射(Java 核心 2 第 I 卷 - 基础,示例 5-5),所以一旦我知道它的名称,我就可以从一个类中获取方法列表。

为了做到这一点,我需要为每个类创建一个实例,问题是如何创建从每个 JAR 文件中获取的每个类的实例? 现在我正在加载每个 JAR:

loader_left = new JarClassLoader("left/1.jar");

public class JarClassLoader extends URLClassLoader {
  public JarClassLoader( URL url ) {
    super( new URL[]{url} );
  }

  public JarClassLoader( String urlString ) throws MalformedURLException {
    this( new URL( "jar:file://" + urlString + "!/" ) );
  }

没有例外,但我在其中找不到任何资源,尝试加载类:

class_left = loader_left.loadClass("level1.level2.class1");

并得到“java.lang.ClassNotFoundException”。

任何胶水问题出在哪里? (类名已经过验证。它是硬编码的,只是为了测试,理想情况下它应该从类列表中获取)

第二个问题:由于 Folder1 和 Folder2 中的大多数类都是相同的,如果我第二次(从 Fodler2)加载相同的类会发生什么?

【问题讨论】:

  • 只是出于好奇想知道为什么需要这样做。

标签: java jar classloader


【解决方案1】:

这不是直接回答您的问题,但是您可以查看 ASM 框架。这允许您分析字节码,而无需使用类加载器加载类。这样做可能更容易。

【讨论】:

  • 谢谢。会调查的!
  • 谢谢你 Danilo,你给了我正确的方向——“分析类文件字节码”...我找到了库 BCEL (jakarta.apache.org/bcel)。
【解决方案2】:

试试jarcomp 实用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多