这个错误在 Stackoverflow 上出现过几次,我会参考这个问题中的其他问题。
我的项目是一个 Android 应用程序,它使用Android Maven 插件来包含库,但也包括一些本地库,因为它们不是通过 maven 提供的。我的 IDE 是 Eclipse。我主要使用本教程来配置它。我对 Maven 比较陌生。
简而言之,我无法在手机上启动应用程序。启动它时,我会看到上面关于我的启动 Activity 的 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
现在,对此建议有多种解决方案:
- 通过转到“构建路径”->“配置构建路径...”来检查是否确实导出了私有库。 2. 在“订购和导出”选项卡中,选中“Android 私有库”选项。希望去工作。” 我检查了该选项,但还是发生了错误。
- 确保 ProGuard 不会剥离类:据我所知,我不使用 proguard。从我看来,一个人必须积极使用 ProGuard,它不只是在那里......我没有。(它在 android 网站上说“让 ProGuard 运行是完全可选的” 。)我检查了我的 project.properties 并且那里的 proguard 行被注释掉了。
- 不要为您的外部库命名文件夹,
lib
但libs
. 我已经为我当地的图书馆这样做了。Maven 库当然存在于 Maven 放置它们的任何地方。有可能我可以把所有这些罐子从 maven repo 放到libs
……然后停止使用 maven。虽然这可能有效,但它几乎没有提供解决方案。 - 从 Build Path 中删除 Double Libs。这或多或少与 3 中描述的问题相同。但这里的重点是,“你不能拥有单个库的不同版本”。已知某些库会提供其他库,因此其中一个库可能位于我的本地文件夹中,并由通过 maven 添加的库之一提供。我在本地包含两个库,一个不公开,因此如果提供一个,它将是android-support-v4.jar。我已经删除了 jar,清理了项目并再次导出,没有任何变化。
- 已经提出建议,这实际上是一个 Eclipse 问题。据说重新启动可能会有所帮助,所以我这样做了。无济于事。我已经尝试过删除
bin
和不删除gen
文件夹。 - 拼写错误
- 使用m2e 插件(已经这样做了)
其他没有成功的想法:
Java 版本:关于我认为使用 Java 1.5 的一些事情。但是,虽然建议使用 1.6,但 1.5 应该可以工作。切换到 1.6 也不会改变任何东西。
通过 Maven 包含的库未导出/索引:我看到的另一个问题是 Maven 依赖项在文件夹中没有显示为索引库bin/dexedLibs
。虽然我相信这将在以后成为一个问题,但我已经从项目中删除了所有使用这些库的类,并且错误仍然存在。
这个问题显然与使用 Maven 有关。如果我创建一个新项目,一切正常,直到我将项目转换为 maven 项目并通过添加库pom.xml
,即使我没有使用任何库的类。
编辑进一步调查:通过创建另一个新项目并发现在第一个“正确的时钟->配置->转换为 maven”上,即使我更改了pom.xml
. 然后我“禁用 maven 自然”,然后“转换为 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 项目,如此处所述。但是,这似乎不起作用,因为我总是收到“无法从原型创建项目”错误(见图)。创建一个非 android maven 项目是另一个糟糕的尝试,因为它不是一个 android 项目,它不解析 Rx 引用并且不 dex 库......
有任何想法吗?