SBT上的libGDX:roboVM后端引用了错误的ASM版本

时间:2014-10-15 02:42:22

标签: scala libgdx robovm

当尝试使用roboVM编译我的游戏时,我不断收到错误:

java.lang.IncompatibleClassChangeError: class org.robovm.compiler.plugin.objc.ObjCProtocolProxyPlugin$1 has interface org.objectweb.asm.ClassVisitor as super class

我已经调查了几个小时,得出结论它与ASM库有关:在库ASM中,直到版本3.3.2,类ClassVisitor是一个接口。它被提升为4.0中的抽象类,而robovm后端字节码使用> = 4.0版本,而我的SBT构建器尝试使用版本< 4.0。

可以在此处找到有问题的roboVM代码:https://github.com/robovm/robovm/blob/master/compiler/src/main/java/org/robovm/compiler/plugin/objc/ObjCProtocolProxyPlugin.java#L145

现在,虽然我意识到这是问题,但我不知道如何修复/解决它。我不想从源代码编译libGDX ......

要设置我的应用,我使用现有模板,即这个:https://github.com/ajhager/libgdx-sbt-project.g8。另外,我分别使用最新版本:

sbt 0.13.5
libGDX 1.4.1
scala 2.11.3
roboVM 1.0.0-alpha-04

1 个答案:

答案 0 :(得分:1)

现在,当我进一步调查,寻找这个集团的罪魁祸首时,我发现确实有两个asm包含在类路径中,前面提到的版本为3.3.1:

scalac -classpath ...:~/.ivy2/cache/asm/asm-all/jars/asm-all-3.3.1.jar:...:~/.ivy2/cache/org.ow2.asm/asm-all/jars/asm-all-4.2.jar:...

这显然导致了崩溃。现在我只需要找到3.3.1被设置为依赖的地方,我很快找到它,最后:pfn / android-sdk-plugin。无论出于何种原因,他们将此设置为依赖项(尽管在某种程度上不在代码中使用它)。显然没有冲突,因为组ID不同:asm:asm-all:3.3.1 vs org.ow2.asm-all:4.2。

这很容易就是我曾经走过的最愚蠢的事情,我磨牙已经花了这么长时间以及如此多的调试才能落后于它。哼!

我通过克隆android-sdk-plugin存储库并将ASM版本/组ID调整为4.2来修复它。然后我继续sbt publish-local并增加了我的项目中的版本号依赖性,以适应克隆的SNAPSHOT版本。

我希望这可以帮助任何遇到这种行为的人。

这么久,
Danyel。