【发布时间】:2013-07-17 15:15:56
【问题描述】:
这个错误在 Stackoverflow 上出现过几次,我会参考这个问题中的其他问题。
我的项目是一个 Android 应用程序,使用 Android Maven Plugin 包含库,但也包括一些本地库,因为它们不是通过 maven 提供的。我的 IDE 是 Eclipse。我已经使用this tutorial mostly 来配置它。我对 Maven 比较陌生。
简而言之,我无法在手机上启动应用程序。启动它时,我会看到上面关于我的启动 Activity 的书面错误,称为 SubscriptionView。下面的整个错误跟踪:
07-17 15:47:42.170: E/AndroidRuntime(20071): FATAL EXCEPTION: main
07-17 15:47:42.170: E/AndroidRuntime(20071): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.dynamixsspbridge/com.example.dynamixsspbridge.SubscriptionView}: java.lang.ClassNotFoundException: com.example.dynamixsspbridge.SubscriptionView
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.app.ActivityThread.access$700(ActivityThread.java:140)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.os.Handler.dispatchMessage(Handler.java:99)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.os.Looper.loop(Looper.java:137)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.app.ActivityThread.main(ActivityThread.java:4921)
07-17 15:47:42.170: E/AndroidRuntime(20071): at java.lang.reflect.Method.invokeNative(Native Method)
07-17 15:47:42.170: E/AndroidRuntime(20071): at java.lang.reflect.Method.invoke(Method.java:511)
07-17 15:47:42.170: E/AndroidRuntime(20071): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
07-17 15:47:42.170: E/AndroidRuntime(20071): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
07-17 15:47:42.170: E/AndroidRuntime(20071): at dalvik.system.NativeStart.main(Native Method)
07-17 15:47:42.170: E/AndroidRuntime(20071): Caused by: java.lang.ClassNotFoundException: com.example.dynamixsspbridge.SubscriptionView
07-17 15:47:42.170: E/AndroidRuntime(20071): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
07-17 15:47:42.170: E/AndroidRuntime(20071): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
07-17 15:47:42.170: E/AndroidRuntime(20071): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
07-17 15:47:42.170: E/AndroidRuntime(20071): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2025)
07-17 15:47:42.170: E/AndroidRuntime(20071): ... 11 more
现在,建议有多种解决方案:
- Checking if one does in fact export private Libraries 转到“构建路径”->“配置构建路径...”。2. 在“订购和导出”选项卡中,选中“Android 私有库”选项。希望能正常工作。”我检查了那个选项,但还是发生了错误。
- Make sure ProGuard does not strip classes away:据我所知,我不使用 proguard。从我看来,一个人必须积极使用 ProGuard,它不只是在那里......我没有。 (上面写着“让 ProGuard 运行是完全可选的”on the android site。)我检查了我的 project.properties 并且那里的 proguard 行被注释掉了。
-
Do not name the folder for your external libraries
libbutlibs。我已经为我当地的图书馆这样做了。 Maven 库当然存在于 Maven 放置它们的任何地方。可能我可以把所有这些罐子从 maven repo 放到libs... 然后停止使用 maven。虽然这可能有效,但它几乎没有提供解决方案。 - Remove Double Libs from Build Path。这或多或少与 3 中描述的问题相同。但这里的重点是,“您不能拥有单个库的不同版本”。已知某些库会提供其他库,因此其中一个库可能位于我的本地文件夹中,并由通过 maven 添加的库之一提供。我在本地包含两个库,一个不公开,因此如果提供一个,它将是 android-support-v4.jar。我已经删除了 jar,清理了项目并再次导出,没有任何变化。
-
Suggestions have been made, that this is actually a Eclipse problem. 重启可能会有所帮助,所以我做到了。无济于事。我已经尝试过删除
bin和gen文件夹。 - Spelling errors
- 使用m2e Plugin(已经这样做了)
其他没有成功的想法:
Java 版本:我觉得可能是我使用 Java 1.5 的原因。但是,虽然建议使用 1.6,但 1.5 应该可以工作。切换到 1.6 也不会改变任何东西。
通过 Maven 包含的库未导出/索引: 我看到的另一个问题是 Maven 依赖项未在文件夹 bin/dexedLibs 中显示为索引库。虽然我相信这在以后会成为一个问题,但我已经从项目中删除了所有使用这些库的类,并且错误仍然存在。
这个问题显然与使用 Maven 有关。如果我创建一个新项目,一切正常,直到我将项目转换为 maven 项目并通过 pom.xml 添加库,即使我没有使用任何库的类。
编辑 进一步调查:通过创建另一个新项目并发现在第一个“正确的时钟->配置->转换为 maven”上,即使我更改了pom.xml,也没有导入任何内容。 I then "disable maven nature" and then "convert to maven"。现在所有库都已导入,现在发生错误。当我在转换之前将pom.xml 包含到项目中时,会发生相同的错误。
奇怪的是,如果我然后“右键单击-> maven->禁用 maven 自然”并删除所有 maven 库和文件,问题仍然存在。
在我转换为 maven 并且 maven 库在项目中之后,所有这一切也发生在一个新的示例项目(只是 eclipse 创建的标准活动和 xml)中,所以它显然与我的代码完全无关......
pom.xml看起来像这样
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>DynamixSSPBridge</groupId>
<artifactId>DynamixSSPBridge</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>DynamixSSPBridge</name>
<properties>
<java-version>1.6</java-version>
</properties>
<repositories>
<repository>
<id>itm-maven-repository-releases-site</id>
<url>https://maven.itm.uni-luebeck.de/content/repositories/releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>de.uniluebeck.itm</groupId>
<artifactId>ncoap</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>src</sourceDirectory>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>3.1.1</version>
<extensions>true</extensions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<configuration>
<sdk>
<platform>9</platform>
</sdk>
</configuration>
</plugin>
</plugins>
</build>
</project>
另一个想法是创建一个具有特定 android 原型的 maven 项目作为described here。但是,这似乎不起作用,因为我总是收到“无法从原型创建项目”错误(见图)。创建一个非 android maven 项目是另一个糟糕的尝试,因为它不是一个 android 项目,它不解析 R.x 引用并且不 dex 库......
有什么想法吗?
【问题讨论】: