【问题标题】:NoClassDefFoundError developing library with Android app, Maven, and EclipseNoClassDefFoundError 使用 Android 应用程序、Maven 和 Eclipse 开发库
【发布时间】:2012-10-22 12:03:18
【问题描述】:

我正在开发一个 Android 库 (SiriRestClient),其工件通过 Maven 进行管理,并且我正在使用 Eclipse 进行开发。我将工件打包为 JAR 文件,因为我在项目中没有任何资产,只有 Java 类,并且有 issues packaging artifacts as apklibs with Eclipse/Maven/ADT

我还在开发一个依赖于 SiriRestClient 库的 Android 用户界面应用程序 (SiriRestClientUI)。我正在通过 Maven 管理对 SiriRestClient 库的依赖。

项目在 Eclipse 中独立构建和部署。

问题:

自从我开始通过 Maven 管理 SiriRestClientUI 对 SiriRestClient 库的依赖后,如果我在 Eclipse 中同时打开了库项目和 SiriRestClientUI,当我尝试将 SiriRestClientUI 应用程序部署到设备时,我会收到 NoClassDefFoundError

例如:

11-01 16:11:52.288: E/AndroidRuntime(9409): java.lang.NoClassDefFoundError: edu.usf.cutr.siri.android.client.config.SiriJacksonConfig
11-01 16:11:52.288: E/AndroidRuntime(9409):     at edu.usf.cutr.siri.android.ui.MainActivity.onCreate(MainActivity.java:100)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.Activity.performCreate(Activity.java:4470)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.access$600(ActivityThread.java:128)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.os.Looper.loop(Looper.java:137)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.main(ActivityThread.java:4514)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at java.lang.reflect.Method.invokeNative(Native Method)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at java.lang.reflect.Method.invoke(Method.java:511)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at dalvik.system.NativeStart.main(Native Method)`

这是库和应用程序同时开发过程中的主要烦恼,因为我发现的唯一解决方法是编辑库代码,构建库项目,关闭库项目,然后执行 SiriRestClientUI应用程序。

我认为问题源于库项目打开时 Eclipse/Maven 如何处理 Maven 依赖项。

这是一个 Eclipse 屏幕截图,显示了 SiriRestClientUI 项目,当库项目(SiriRestClient,在它上面)关闭时:

您可以看到“Maven 依赖项”下的sirirestclient-1.0.0-SNAPSHOT.jar 文件是从我的本地 Maven 存储库中提取的,这正是我想要的。在这种配置下,一切正常。

但是,当我打开 SiriRestClient 库项目时,我的“Maven 依赖项”条目发生了变化,JAR 文件消失了,而是显示了该项目的文件夹:

如果我在两个项目都打开时尝试启动 SiriRestClientUI,那么我会得到 NoClassDefFoundError。因此,似乎 Eclipse 正在重定向项目构建并且未包含库类。

问题:

如何配置 Eclipse/Maven 使其始终依赖本地 Maven 存储库中的 JAR 文件,而不是将 Maven 依赖切换到本地项目?

或者,有没有其他方法可以通过这种配置摆脱NoClassDefFoundError

库项目的 pom.xml 文件是here

SiriRestClientUI 应用项目的 pom.xml 文件是 here

【问题讨论】:

    标签: android eclipse maven adt android-maven-plugin


    【解决方案1】:

    试试这个:右击项目->属性->Maven->取消选中Resolve dependencies from Workspace projects

    【讨论】:

      【解决方案2】:

      你需要确定两件事, 第一:依赖的android peoject应该有节点apklib,像这样,不要忘记打包节点

      <modelVersion>4.0.0</modelVersion>
      <groupId>cn.company.common</groupId>
      <artifactId>util</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>apklib</packaging>
      <name>util</name>
      

      第二个:android项目的依赖节点应该是这样的,别忘了类型节点,记得添加

      <dependency>
      <groupId>cn.company.common</groupId>
      <artifactId>util</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <type>apklib</type>
      </dependency>
      

      【讨论】:

      • 这不能回答我的问题。 Aleksandr M 的解决方案是正确答案。
      猜你喜欢
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      相关资源
      最近更新 更多