Java 使用JarJar重新打包工具

Java 使用JarJar重新打包工具,java,google-app-engine,jersey,Java,Google App Engine,Jersey,我已经将一个web应用程序部署到Google应用程序引擎,我的web服务使用jersey 1.14框架。当我尝试使用或调用GAE上的web服务时,我得到一个java.lang.CompatibleClassChangeError:Implementing类。我四处搜索,发现jersey 1.14依赖于asm 3.1,google app engine使用asm 4.0,并意识到我必须使用JarJar打包依赖项来解决这个问题,但我不知道如何使用JarJar实现这一点。我发现的教程非常神秘,面向有经

我已经将一个web应用程序部署到Google应用程序引擎,我的web服务使用jersey 1.14框架。当我尝试使用或调用GAE上的web服务时,我得到一个java.lang.CompatibleClassChangeError:Implementing类。我四处搜索,发现jersey 1.14依赖于asm 3.1,google app engine使用asm 4.0,并意识到我必须使用JarJar打包依赖项来解决这个问题,但我不知道如何使用JarJar实现这一点。我发现的教程非常神秘,面向有经验的程序员。因此,有人可以发布一个面向初学者的教程,或者指导我解决这个问题的步骤。

您可以使用jdk的jar命令提取和合并jar文件
jar-xvf firstjar.jar。。。。它将提取jar classes文件夹/package-wise-com/pak1/pak2
现在,提取第二个jar并合并两个扩展文件夹
不,您可以创建合并类文件的单个jar。

jar-cvf mergedjar.jar[folders name[ex-com-org…],有关详细信息,请查看jar命令的工作原理。

这是一个很晚的答案,但如果有人路过,可能会有所帮助。我将举一个例子来解释这一点。jarjar可用于重新打包java库。它可以用于更改名称空间,例如org.apache.common.codec需要更改为一些_random_name.org.apache.common.codec。稍后从中下载jarjar粘贴要更改的jar文件(myinjar.jar)并将下载的jarjar粘贴到一个文件夹中,然后运行以下命令
java-jar-jar-1.4.jar process myrules.txt myinjar.jar myoutjar.jar
在myrules.txt中添加这些行

rule org.apache.commons.codec.** some_random_name.org.apache.commons.codec.@1

输出myoutjar.jar将保存到同一个文件夹中,您可以在项目中使用它,而不会产生任何冲突

这不会有帮助,因为在运行时,具有相同完全限定名的类将发生冲突。Jarjar不仅仅是合并jar。不过我还是得自己想一想。语法错误:重复的jar条目:META-INF/LICENSE.txtgikarasojo也许这能帮我解决一个复杂的问题。我想使用一个库
m.jar
提供的一些功能。这个库要求我使用一个类
BindingProvider
,它可以在package
javax
中找到,但不在android中。因此,我不得不下载另一个jar,名为
androidws-combine.jar
。当我将它添加到模块中并试图运行它时,我得到了错误
错误:处理“javax/xml/xmlcontents.class”时遇到问题:
。我认为重新打包
android ws-combine.jar
会有所帮助,但我的另一个jar
m.jar
也会抛出一些错误,因为它找不到
javax.BindingProvider
,因为我在重新打包时重命名了
javax
包,也许你不应该更改android-ws-combine.jar,由于重新打包会更改名称空间,并且您的m.jar找不到合适的包并会抛出错误,您是否可以尝试在不重新打包的情况下包含该包,然后查看它是否仍然抛出错误?这种方法可能会有问题,因为SPI META-INF/服务文件(Jersey大量使用它们)。AFAIKJARJAR不处理它们,因此当您合并JAR时,有关服务提供者的信息将丢失。您应该使用:和中提供的解决方案