java - 运行使用 Maven 构建的 Android 应用程序时出现 NoClassDefFoundError

标签 java android maven noclassdeffounderror android-volley

我收到一个存在于我的 Android 应用程序中的类的 NoClassDefFoundError。我正在使用 maven 构建,找不到的类是 LruBitmapCache.java,这是我在我的 android 项目中编写的 Volley ImageCache 的实现:

package com.x.y.app;

public class LruBitmapCache extends LruCache<String, Bitmap> implements ImageCache
{
    public static int getDefaultLruCacheSize()
    {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        final int cacheSize = maxMemory / 8;

        return cacheSize;
    }

    public LruBitmapCache()
    {
        this(getDefaultLruCacheSize());
    }

    public LruBitmapCache(int sizeInKiloBytes)
    {
        super(sizeInKiloBytes);
    }

    @Override
    protected int sizeOf(String key, Bitmap value)
    {
        return value.getRowBytes() * value.getHeight() / 1024;
    }

    @Override
    public Bitmap getBitmap(String url)
    {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap)
    {
        put(url, bitmap);
    }
}

我的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">
    <parent>
        <groupId>com.x.y</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../../parent</relativePath>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>android-project</artifactId>
    <packaging>apk</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.8.2</version>
                <configuration>
                    <sdk>
                        <platform>19</platform>
                    </sdk>
                    <deleteConflictingFiles>true</deleteConflictingFiles>
                    <undeployBeforeDeploy>false</undeployBeforeDeploy>
                    <device>usb</device>
                </configuration>
                <extensions>true</extensions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>android</groupId>
            <artifactId>android</artifactId>
            <version>4.4.2_r3</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>support-v4</artifactId>
            <version>r7</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.1</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.12</version>
        </dependency>

        <dependency>
            <groupId>com.googlecode.androidannotations</groupId>
            <artifactId>androidannotations</artifactId>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>com.mcxiaoke.volley</groupId>
            <artifactId>library</artifactId>
            <version>1.0.6</version>
        </dependency>

        <dependency>
            <groupId>fr.avianey</groupId>
            <artifactId>facebook-android-api</artifactId>
            <version>3.17.1</version>
        </dependency>

        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-core</artifactId>
            <version>4.0.2</version>
        </dependency>

    </dependencies>
</project>

我正在使用“mvn install android:deploy”构建和部署应用程序,它成功地将应用程序部署到设备,但是当我尝试打开应用程序时,我得到了 NoClassDefFoundError(因为一些应用程序代码试图初始化LruBitmapCache)。我原以为这可能是因为 Volley 依赖项没有包含在类中,但我不是 100% 确定 dex 类是如何工作的。有谁知道为什么会发生这种情况,或者以前有人遇到过这种情况吗?错误的类(class)?依赖冲突?感谢您的帮助。

编辑: 附上 Logcat

08-31 04:24:36.385: E/dalvikvm(19634): Could not find class 'com.x.y.app.LruBitmapCache', referenced from method com.x.y.app.AppController.getImageLoader

08-31 04:24:36.485: E/AndroidRuntime(19634): Process: com.x.y, PID: 19634
08-31 04:24:36.485: E/AndroidRuntime(19634): java.lang.NoClassDefFoundError: com.x.y.app.LruBitmapCache
08-31 04:24:36.485: E/AndroidRuntime(19634): at com.x.y.app.AppController.getImageLoader(AppController.java:38)
08-31 04:24:36.485: E/AndroidRuntime(19634): at com.x.y.activitiy.MyActivity.init(MyActivity.java:41)
08-31 04:24:36.485: E/AndroidRuntime(19634): at com.x.y.activitiy.MyActivity_.afterSetContentView_(MyActivity_.java:89)
08-31 04:24:36.485: E/AndroidRuntime(19634): at com.x.y.activitiy.MyActivity_.setContentView(MyActivity_.java:95)
08-31 04:24:36.485: E/AndroidRuntime(19634): at com.x.y.activitiy.MyActivity.onCreate(MyActivity.java:27)
08-31 04:24:36.485: E/AndroidRuntime(19634): at com.x.y.activitiy.MyActivity_.onCreate(MyActivity_.java:32)

从堆栈跟踪可以看出,我正在使用 android 注释。对 LruBitmapCache 的引用来自 AppController(在 AndroidManifest.xml 中声明为 android 应用程序),它在 MyActivity 的 @AfterViews init 方法中调用。

AppController.java

package com.x.y.app;

public class AppController extends Application
{
    private RequestQueue requestQueue;
    private ImageLoader imageLoader;

    public RequestQueue getRequestQueue()
    {
        if (requestQueue == null)
        {
            requestQueue = Volley.newRequestQueue(getApplicationContext());
        }

        return requestQueue;
    }

    public ImageLoader getImageLoader()
    {
        getRequestQueue();

        if (imageLoader == null)
        {
            //NoClassDefFoundError thrown when instantiation of LruButmapCache attempted here
            imageLoader = new ImageLoader(requestQueue, new LruBitmapCache());
        }

        return imageLoader;
    }
}

MyActivity.java

package com.x.y.activity;

@EActivity(R.layout.my_activity)
public class MyActivity extends AbstractActivity
{
    private MyAdapter adapter;

    @ViewById
    ListView listView;

    @AfterViews
    public void init()
    {
        AppController application = getApplicationContext();
        adapter = new MyAdapter(application.getImageLoader());
        listView.setAdapter(adapter);
    }
}

抽象 Activity .java

public abstract class AbstractActivity extends Activity
{
    @Override
    public AppController getApplicationContext()
    {
        return (AppController) super.getApplicationContext();
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.x.y"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="22" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name="com.x.y.app.AppController"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/appTheme"
        android:windowSoftInputMode="stateHidden">
        <activity android:name="com.x.y.activitiy.MyActivity_">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

最佳答案

我以我认为完全相同的方式逐步重建了我的项目,并且问题已经消失。我想我永远不会知道问题出在哪里。

关于java - 运行使用 Maven 构建的 Android 应用程序时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25590294/

相关文章:

java - 如何从泛型中获取类类型信息?

Java 正则表达式模式匹配器

android - 改造 android 不工作和改造错误 401

java - 如何将 Maven 版本从 3.2.X 降级到 3.0.4

java - Gradle在eclipse中找到错误的maven存储库url

java - servlets 连接和在 tomcat 上运行

android GCM 推送通知

android - 按百分比划分屏幕

java - 资源不在 javascript 项目的构建路径上

java - 以编程方式添加相对布局