首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Android app、Maven和NoClassDefFoundError开发库

使用Android app、Maven和NoClassDefFoundError开发库
EN

Stack Overflow用户
提问于 2012-11-02 04:23:03
回答 2查看 1.5K关注 0票数 4

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

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

在Eclipse中,两个项目都可以独立构建和部署。

问题是:

因为我是通过Maven管理SiriRestClient库上的SiriRestClientUI依赖项的,所以如果我在Eclipse中同时打开了库项目和SiriRestClientUI,那么当我尝试将SiriRestClientUI应用程序部署到设备上时,就会得到一个NoClassDefFoundError

例如:

代码语言:javascript
复制
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依赖项的方式。

下面是当库项目(SiriRestClient,在上面)关闭时显示SiriRestClientUI项目的Eclipse屏幕截图:

您可以在"Maven Depedencies“下看到从我本地的Maven存储库中拉出的sirirestclient-1.0.0-SNAPSHOT.jar文件,这正是我想要的。在这种配置下,一切工作正常。

然而,当我打开SiriRestClient库项目时,我的"Maven Depedencies“条目发生了变化,JAR文件消失了,取而代之的是显示了该项目的文件夹:

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

问题是:

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

或者,有没有其他方法可以使用这种配置来摆脱NoClassDefFoundError

库项目的pom.xml文件是here

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-02 05:43:35

试试这个:右键单击项目-> Properties -> Maven -> uncheck Resolve dependencies from Workspace projects

票数 5
EN

Stack Overflow用户

发布于 2014-09-19 15:43:28

你需要确定两件事,首先: android对象依赖应该有节点apklib,像这样,不要忘了打包节点

代码语言:javascript
复制
<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项目依赖节点应该是这样的,不要忘记type节点,记得添加

代码语言:javascript
复制
<dependency>
<groupId>cn.company.common</groupId>
<artifactId>util</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>apklib</type>
</dependency>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13184900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档