使用Android支持库和Maven的NoClassDefFoundError

时间:2014-10-20 13:28:24

标签: android maven android-support-library android-maven-plugin

使用Maven Android插件的最新版本4.0.0-rc.1,构建中似乎缺少某些类。当我启动应用程序时,我得到了其中一个例外(启动应用程序的两种可能方式):

  • java.lang.NoClassDefFoundError:android.support.v4.app.TaskStackBuilderHoneycomb
  • java.lang.NoClassDefFoundError:android.support.v4.widget.EdgeEffectCompatIcs

两个缺失的类都在support-v4-21.0.0.aar / libs / internal_impl-21.0.0.jar中。

我的依赖关系定义:

    <dependency>
        <groupId>com.android.support</groupId>
        <artifactId>support-v4</artifactId>
        <version>21.0.0</version>
        <type>aar</type>
    </dependency>

这是一些配置错误吗? Android Maven插件中的一个错误?

3 个答案:

答案 0 :(得分:10)

您需要在pom中设置以下配置:

<includeLibsJarsFromAar>true</includeLibsJarsFromAar>

所以它看起来像这样:

<plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        //...
        <includeLibsJarsFromAar>true</includeLibsJarsFromAar>
        //... rest of config
    </configuration>    
</plugin>

这种变化的原因是谷歌决定把罐子放在aar里面,这是一种不好的依赖做法。如果要替换版本或其他内容,则目前无法替换。简而言之,它使依赖关系变得更加难以管理。

默认情况下,此设置设置为false,以阻止在libs文件夹中使用jar创建aar的行为。

更新

使用最新的Android-Maven-Plugin(现在4.1.1很快4.2.0),默认情况下此标志设置为true,因此您不再需要添加它。

答案 1 :(得分:0)

我找到了一个临时解决方案:

  • cp support-v4-21.0.0.aar ~/Desktop
  • cd ~/Desktop && mv support-v4-21.0.0.aar support-v4-21.0.0.jar
  • jar xf support-v4-21.0.0.jar

然后从internal_impl-21.0.0.jar文件夹中取出libs并上传到您自己的神器(如果有的话),并修改它应该有效的pom文件,如果你没有自己的神器,那么添加它进入类路径。

这对我有用。

答案 2 :(得分:0)

你是否包含一个jar文件,其中包含aar依赖的“提供”范围?我想我发现了同样的错误并且遇到了同样的问题。

https://github.com/jayway/maven-android-plugin/issues/485