Java 比较两个.jar文件

Java 比较两个.jar文件,java,jar,comparison,diff,Java,Jar,Comparison,Diff,如何比较两个.jar文件? 它们都编译了.class文件 我希望在方法更改等方面有所不同。用于将jar文件转换为源代码文件,然后用于执行比较 您应该咨询源代码的版权所有者,看看这样做是否合适 将.jar重命名为.zip 提取 使用 递归的 这里有一个完全免费的工具使用参数为xvf的jar命令将每个jar提取到它自己的目录中。i、 e.jar xvf myjar.jar用于每个jar 然后,使用UNIX命令diff比较这两个目录。这将显示目录中的差异。您可以使用diff-rdir1 dir2two

如何比较两个.jar文件? 它们都编译了.class文件

我希望在方法更改等方面有所不同。

用于将jar文件转换为源代码文件,然后用于执行比较

您应该咨询源代码的版权所有者,看看这样做是否合适

  • 将.jar重命名为.zip
  • 提取
  • 使用
  • 递归的

  • 这里有一个完全免费的工具

    使用参数为xvf的jar命令将每个jar提取到它自己的目录中。i、 e.
    jar xvf myjar.jar
    用于每个jar

    然后,使用UNIX命令
    diff
    比较这两个目录。这将显示目录中的差异。您可以使用
    diff-rdir1 dir2
    two recurse并显示每个目录(.xml、.properties等)中文本文件的差异

    这还将显示二进制类文件是否不同。要实际比较类文件,您必须按照其他人的说明对它们进行反编译。

    请尝试-工具很旧,依赖项列表很大。从文档来看,它似乎值得一试。

    我使用lib(既有Java也有ant-API)。

    • ,示例用法:

      japi合规性检查程序OLD.jar NEW.jar

      log4j的示例报告:

    • ,示例用法:

      pkgdiff OLD.jar NEW.jar

      有关args4j,请参阅

    • ,示例用法:

      java-jar-clirr-core-0.6-uber.jar-o OLD.jar-n NEW.jar


    在Linux/CygWin中,我有时使用的一个方便的脚本是:

    #Extract the jar (war or ear)
    cd dir1
    jar xvf jar-file1
    for i in `ls *.class`
    do
     javap $i > ${i}.txt #list the functions/variables etc
    done
    
    cd dir2
    jar xvf jar-file2
    for i in `ls *.class`
    do
     javap $i > ${i}.txt #list the functions/variables etc
    done
    
    diff -r dir1 dir2 #diff recursively
    
    使用并反编译所有.class文件,并将所有文件另存为项目结构


    然后使用meld diff viewer并将其作为文件夹进行比较。

    以下是我的脚本,用于执行sje397所述的过程:

        #!/bin/sh
    
        # Needed if running on Windows
        FIND="/usr/bin/find"
        DIFF="diff -r"
    
        # Extract the jar (war or ear)
        JAR_FILE1=$1
        JAR_FILE2=$2
    
        JAR_DIR=${PWD}          # to assign to a variable
        TEMP_DIR=$(mktemp -d)
    
        echo "Extracting jars in $TEMP_DIR"
    
        EXT_DIR1="${TEMP_DIR}/${JAR_FILE1%.*}"
        EXT_DIR2="${TEMP_DIR}/${JAR_FILE2%.*}"
    
        mkdir ${EXT_DIR1}
        cd ${EXT_DIR1}
        jar xf ${JAR_DIR}/${JAR_FILE1}
        jad -d . -o -t2 -safe -space -b -ff -s java -r **/*.class
        cd ..
    
        mkdir ${EXT_DIR2}
        cd ${EXT_DIR2}
        jar xf ${JAR_DIR}/${JAR_FILE2}
        jad -d . -o -t2 -safe -space -b -ff -s java -r **/*.class
        cd ..
    
        # remove class files so the diff is clean
        ${FIND} ${TEMP_DIR} -name '*.class' | xargs rm
    
        # diff recursively 
        ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
    


    我可以使用GIT for Windows在Windows上运行它。只需打开一个命令提示符。运行bash,然后从那里执行脚本。

    如果您在IntellijIdea中选择两个文件,然后按
    Ctrl+D
    ,它将显示差异。我使用的是Ultimate,不知道它是否可以与Community edition一起使用。

    创建一个文件夹并创建另外两个文件夹里面像旧的和新的一样。将相关jar文件添加到文件夹中。然后使用IntelliJ打开第一个文件夹。之后,单击要比较的两个文件,然后右键单击,然后单击比较存档

    谢谢。我试过这个。它以XML形式生成输出,如果在.jar中有许多类,则需要进一步处理以使其可读。对我来说,它抱怨缺少tools.jar。我确实使用JDK,所以这不是问题所在。我认为它不支持java7。@Tom链接断开了,这个答案可以删除。这是蛮力,但这正是我要做的。(除了我可能使用
    jar
    来提取内容,而不是重命名文件并使用
    pkunzip
    )或者用调用
    javap-c
    来替换步骤3,以将其保留为字节码(特别是如果通过“方法更改”,OP意味着更改方法的签名)。如何处理在源文件中上移或下移的方法体?我认为这会使
    javap
    jad
    diff
    输出变得不正常?它们来自同一个核心吗?@NikolayKuznetsov,不,这些工具有不同的核心。pkgdiff—类声明的可视化比较、japi符合性检查和clirr—更改分析(第一个是用perl编写的,第二个是用java编写的)。您是否尝试过与TeamCity集成一些东西?clirr似乎有一个Maven插件,还有一个叫做JAPI-Checker的工具。请注意,JAPI Compliance Checker和Pkgdiff并没有对所有内容进行比较。例如,所有方法实现都被忽略。只有方法签名、方法删除和API兼容性作为报告生成。如果你能比较二进制文件,那么你可以选择使用diff、cmp、IntelliJ插件等工具,甚至是Beyond Compare!似乎您错过了最后一行:
    diff-r${EXT\u DIR1}${EXT\u DIR2}
    ${diff}${EXT\u DIR1}${EXT\u DIR2}
    (如果重用声明的变量)。对于那些使用cygwin的人来说,除了两件我已经改变的事情外,这个脚本几乎对我起了作用:1)我不得不使用内置javap而不是jad,因为我无法下载jad(entrep.firewall;2) 由于
    jarxf
    不理解cygwin中
    pwd
    返回的
    /cygwin/c/rest/of/path
    之类的路径,我必须将其转换为
    c:/rest/of/path
    jar_DIR=${pwd}
    jar DIR=${jar_DIR*/cygdrive/c}
    。最后一行是${DIFF}${EXT_DIR1}${EXT_DIR2}什么是
    jad
    ?PATHJad是一个Java反编译器,没有可用的二进制文件。我认为它不再被维护了,但我发现它在以下位置可用:如果您的参数(jar文件)位于子目录中(如
    foo/bar/toto.jar
    ),则需要将
    -p
    参数添加到mkdircommand@ChristianNilsson,于2018年2月在Mac 10.14上运行,Mojave thoughI错误地选择了Maven包装器。在ExternalLibraries下,需要展开包装器,然后选择jar文件。谢谢@xueshengSuper easy solution。太棒了,这正是我想要的:)这对我很有效。非常感谢!