&引用;多个scala库“;在Scala/Android项目中

&引用;多个scala库“;在Scala/Android项目中,android,eclipse,scala,libgdx,proguard,Android,Eclipse,Scala,Libgdx,Proguard,我在eclipse中有一个libgdx android项目,我在其中添加了scala和AndroidDrugardScala属性。这工作得很好,但eclipse突然开始警告我“在构建路径上找到了多个Scala库”。我仍然可以在设备上构建和安装该项目,但它会立即退出,并带有NoClassDefFoundError:scala.Tuple2$mcZZ$sp,因此看起来scala库根本没有包含在内 我的项目似乎在“Scala library[2.10.1]”(称为“Scala library.jar”

我在eclipse中有一个libgdx android项目,我在其中添加了scala和AndroidDrugardScala属性。这工作得很好,但eclipse突然开始警告我“在构建路径上找到了多个Scala库”。我仍然可以在设备上构建和安装该项目,但它会立即退出,并带有
NoClassDefFoundError:scala.Tuple2$mcZZ$sp
,因此看起来scala库根本没有包含在内

我的项目似乎在“Scala library[2.10.1]”(称为“Scala library.jar”)和“Android依赖项”(称为“Scala_library.min.jar”)下都有Scala库,所以我猜Proguard输出与原始库冲突,但我不知道为什么会发生这种情况,也不知道如何修复它

在这一点上,我可以做一个新的项目并复制源文件,但如果有人能对此有所了解,那就太好了

编辑:经过一些实验,结果表明,这段代码(来自trait的方法)似乎是导致问题的原因

acckeys match {
  case (true, false) => acceleration.set(0, accel).rotate(rotation)
  case (false, true) => acceleration.set(0, -accel).rotate(rotation)
  case _ => acceleration.set(0, 0)
}
(其中acckeys是一个返回元组的函数,
加速度
是一个向量)


多个库警告仍然存在,因此我想这与问题无关。幸运的是,我实际上不需要从项目的android版本中引用这段代码,但了解这段代码编译但无法运行的原因仍然很有用。

我确切地知道您遇到了什么问题。这与AndroidProgordScala无法识别主项目中的类文件有关。结果是,android项目中定义的所有类都被包括在内,但任何“新”类(如元组)都将丢失,因此您将得到奇妙的NoClassDefFoundError。我没有遇到“在构建路径上找到多个Scala库”的警告,但这可能意味着您将Scala特性添加到了项目中,并在其顶部添加了library.jar。尝试撤消您的配置,并按照下面的说明操作;否则,请按照以下步骤设置一个新项目,并复制源代码

我发现Scala Nature和Android Proguard Scala在运行了一段时间后有点难以修复。我不是100%肯定你能挽救一个现有的项目,但我们可以试试看会发生什么。首先,从您的项目中删除所有与scala相关的属性,并将它们恢复到它们的初始状态,这些状态只适用于一个普通的旧Java项目

让我们了解一下使用Scala设置libGDX的过程,看看哪里出了问题:

  • (注意:您需要获得最新版本)
  • (或在您的案例中使用现有项目)
  • 右键单击android项目,“添加Scala nature”,然后“添加AndroidProgordScala nature”
  • 右键单击主项目“添加Scala nature”
  • 右键单击桌面项目“添加Scala nature”
  • 现在,这可能是您已经做到的,但是仍然存在AndroidProgordScala不知道您的主要项目中有哪些类的问题。它似乎忽略了包含的项目,并且没有将它们添加到scala_library.min.jar中。为了解决这个问题,我找到了一个很好的解决方案:

  • 右键单击Android项目>属性>Java构建路径
  • 转到“项目”选项卡,删除主项目。我知道这是违反直觉的,但相信我
  • 转到“源”选项卡>链接源
  • 导航并从主项目中选择“src”文件夹
  • 按OK
  • 清理和重建项目

  • 这个设置我已经测试并广泛使用,没有任何问题。Android和桌面版本都很满意,使用Scala或混合代码时不会有任何抱怨。android项目现在完全了解您在主项目中使用的所有Scala类,因为源代码现在被复制到android项目的构建中。(即,任何与Scala相关的内容都不应出现NoClassDefFoundError)

    当我的Proguard配置文件出现问题时,我收到了类似的消息。您可以检查:

    • Proguard正在运行吗
    • 您的配置文件有:-keep public class**.YourPackage.**或类似的内容
    • 您的配置文件已针对Scala库进行了修改,例如

      ## SCALA SETTINGS -dontwarn **$$anonfun$* -dontwarn scala.android.** -dontwarn scala.beans.ScalaBeanInfo -dontwarn scala.collection.generic.GenTraversableFactory -dontwarn scala.collection.immutable.RedBlack$Empty -dontwarn scala.concurrent.forkjoin.** -dontwarn scala.reflect.** -dontwarn scala.sys.process.** -dontwarn scala.tools.**,plugintemplate.** #(org.xml.sax.EntityResolver)Class.forName(variable).newInstance() -dontnote org.xml.sax.EntityResolver #(org.apache.james.mime4j.storage.StorageProvider)Class.forName(variable).newInstance() -dontnote org.apache.james.mime4j.storage.DefaultStorageProvider -dontnote scala.android.app.Activity -keep class scala.android.package** -keep class * extends scala.android.app.Activity ## Fixes ==> Warning: ... can't find referenced class sun.misc.Unsafe -libraryjars D:\Program Files\Apache\m2\repository\com\google\code\findbugs\jsr305\2.0.1\jsr305-2.0.1.jar -dontwarn sun.misc.Unsafe -keep class * extends scala.runtime.MethodCache { public ; } -keepclassmembers class * { ** MODULE$; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool { long eventCount; int workerCounts; int runControl; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread { int base; int sp; int runState; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask { int status; } -keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue { scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe; } ##SCALA设置 -dontwarn**$$anonfun$* -dontwarn scala.android** -dontwarn scala.beans.ScalaBeanInfo -dontwarn scala.collection.generic.GenTraversableFactory -dontwarn scala.collection.immutable.RedBlack$Empty -dontwarn scala.concurrent.forkjoin** -dontwarn scala.reflect** -dontwarn scala.sys.process** -dontwarn scala.tools.*,plugintemplate** #(org.xml.sax.EntityResolver)Class.forName(变量).newInstance() -dontnote org.xml.sax.EntityResolver #(org.apache.james.mime4j.storage.StorageProvider)Class.forName(variable.newInstance() -dontnote org.apache.james.mime4j.storage.DefaultStorageProvider -dontnote scala.android.app.Activity -保留类scala.android.package** -keep class*扩展scala.android.app.Activity ##修复==>警告:。。。找不到引用的类sun.misc.Unsafe -libraryjars D:\Program Files\Apache\m2\repository\com\google\code\findbugs\jsr305\2.0.1\jsr305-2.0.1.jar -dontwarn sun.misc -keep class*扩展了scala.runtime.MethodCache{ 公众; } -keepclassmembers类*{ **模块$; } -keepclassmembernames类scala.concurrent.forkjoin.ForkJoinPool{ 长事件计数; 国际工人计数; int运行控制; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; } -keepclassmembernames类scala.concurrent.forkjoin.ForkJoinWorkerThread{ int-base; int sp; int运行状态; } -keepclassmembernames类scala.concurrent.forkjoin.ForkJoinTask{ 智力状态; } -keepclassmembernames类scala.concurrent.forkjoin.LinkedTransferQueue{ s