11

这个错误在 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

现在,对此建议有多种解决方案:

  1. 通过转到“构建路径”->“配置构建路径...”来检查是否确实导出了私有库。 2. 在“订购和导出”选项卡中,选中“Android 私有库”选项。希望去工作。” 我检查了该选项,但还是发生了错误。
  2. 确保 ProGuard 不会剥离类:据我所知,我不使用 proguard。从我看来,一个人必须积极使用 ProGuard,它不只是在那里......我没有。(它在 android 网站上说“让 ProGuard 运行是完全可选的” 。)我检查了我的 project.properties 并且那里的 proguard 行被注释掉了。
  3. 不要为您的外部库命名文件夹,liblibs. 我已经为我当地的图书馆这样做了。Maven 库当然存在于 Maven 放置它们的任何地方。有可能我可以把所有这些罐子从 maven repo 放到libs……然后停止使用 maven。虽然这可能有效,但它几乎没有提供解决方案。
  4. 从 Build Path 中删除 Double Libs。这或多或少与 3 中描述的问题相同。但这里的重点是,“你不能拥有单个库的不同版本”。已知某些库会提供其他库,因此其中一个库可能位于我的本地文件夹中,并由通过 maven 添加的库之一提供。我在本地包含两个库,一个不公开,因此如果提供一个,它将是android-support-v4.jar。我已经删除了 jar,清理了项目并再次导出,没有任何变化。
  5. 已经提出建议,这实际上是一个 Eclipse 问题。据说重新启动可能会有所帮助,所以我这样做了。无济于事。我已经尝试过删除bin和不删除gen文件夹。
  6. 拼写错误
  7. 使用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 库......

日食中的错误消息

有任何想法吗?

4

1 回答 1

0

我有同样的问题。我建议您完全依赖 maven 命令,不要将 IDE 用于任何事情(调试除外),因为maven-android-plugin它会以自己的方式编译东西。

安装本地jar文件

您可以将本地库 jar 文件(Maven 无法在线使用)安装到本地存储库:

例如,这里我们将无法在线获得的副本复制到我们机器上的本地存储库android.jar4.03

mvn install:install-file \
 -Dfile=$ANDROID_HOME/platforms/android-15/android.jar \
 -DgroupId=com.google.android \
 -DartifactId=android \
 -Dversion=4.0.3 \
 -Dpackaging=jar \
 -DgeneratePom=true

现在我们可以将它包含在 POM 中:

  <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android</artifactId>
        <version>${platform.version}</version>
        <scope>provided</scope>
  </dependency>

Maven 将查看本地存储库并使用这些 jar 文件。

设置正确的范围

未包含类的问题(在我的情况下)是由<scope>POM 中的依赖项错误引起的。因此,对于所有库的依赖项设置<scope>compile.

尝试运行mvn clean,mvn installmvn:android deploy.

只有当您能够在mvn没有任何 IDE 左右的情况下从命令行运行它时,您的 Maven 项目才是好的。

于 2013-07-21T05:43:38.060 回答