【问题标题】:ClassNotFoundException dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)ClassNotFoundException dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
【发布时间】: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

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

  1. Checking if one does in fact export private Libraries 转到“构建路径”->“配置构建路径...”。2. 在“订购和导出”选项卡中,选中“Android 私有库”选项。希望能正常工作。”我检查了那个选项,但还是发生了错误。
  2. Make sure ProGuard does not strip classes away:据我所知,我不使用 proguard。从我看来,一个人必须积极使用 ProGuard,它不只是在那里......我没有。 (上面写着“让 ProGuard 运行是完全可选的”on the android site。)我检查了我的 project.properties 并且那里的 proguard 行被注释掉了。
  3. Do not name the folder for your external libraries lib but libs。我已经为我当地的图书馆这样做了。 Maven 库当然存在于 Maven 放置它们的任何地方。可能我可以把所有这些罐子从 maven repo 放到libs... 然后停止使用 maven。虽然这可能有效,但它几乎没有提供解决方案。
  4. Remove Double Libs from Build Path。这或多或少与 3 中描述的问题相同。但这里的重点是,“您不能拥有单个库的不同版本”。已知某些库会提供其他库,因此其中一个库可能位于我的本地文件夹中,并由通过 maven 添加的库之一提供。我在本地包含两个库,一个不公开,因此如果提供一个,它将是 android-support-v4.jar。我已经删除了 jar,清理了项目并再次导出,没有任何变化。
  5. Suggestions have been made, that this is actually a Eclipse problem. 重启可能会有所帮助,所以我做到了。无济于事。我已经尝试过删除bingen文件夹。
  6. Spelling errors
  7. 使用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 库......

有什么想法吗?

【问题讨论】:

    标签: android maven exception


    【解决方案1】:

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

    安装本地jar文件

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

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

    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 文件。

    设置正确的范围

    没有包含类的问题(在我的情况下)是由 POM 中的依赖项 &lt;scope&gt; 错误引起的。因此,对于所有库的依赖项,将 &lt;scope&gt; 设置为 compile

    尝试运行mvn cleanmvn installmvn:android deploy

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

    【讨论】:

    • 我已经重新启动了项目并在 ecery 一个小步骤之后制作了我的 eclipse 项目的副本,以了解错误发生的确切时间。我使用了 provided 我还通过 ${project.basdir]/.../ 将本地 jar 包作为 maven 依赖项并进行了一些其他更改。虽然我不知道究竟是什么解决了这个问题,但该项目现在正在毫无问题地工作,所以我正在回答这个答案,这让我走上了正确的轨道,并为其他有此问题的用户发表评论:这可能是也可能不是单一的问题,但做什么 S.D.说似乎很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多