2014-08-31 1 views
1

Je reçois un NoClassDefFoundError pour une classe qui existe dans mon application Android. Je construis avec Maven et la classe qui ne peut être trouvée est LruBitmapCache.java, une mise en œuvre du Volley ImageCache que je l'ai écrit dans mon projet Android:NoClassDefFoundError lors de l'exécution de l'application Android créée avec Maven

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); 
    } 
} 

Mon pom.xml est la suivante

<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> 

Je construis et le déploiement de l'application avec « mvn install android: déployer », qui déploie avec succès l'application de l'appareil, mais quand je tente d'ouvrir l'application je reçois le NoClassDefFoundError (depuis quelques tentatives de code d'application initialiser le LruBitmapCache). J'avais supposé que c'était peut-être parce que la dépendance de Volley n'était pas incluse dans les classes, mais je ne suis pas sûr à 100% comment les classes dex fonctionnent. Est-ce que quelqu'un a une idée de ce qui pourrait arriver ou est-ce que quelqu'un l'a déjà eu? Cours défectueux? Conflit de dépendance? Toute aide est appréciée.

EDIT: Logcat attaché

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) 

Comme on le voit à partir de la trace de la pile, j'utilise des annotations Android. La référence à LruBitmapCache est faite à partir de AppController (qui est déclarée comme l'application android dans le AndroidManifest.xml) qui est invoquée dans la méthode init @AfterViews de MyActivity.

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); 
    } 
} 

AbstractActivity.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> 
+0

est-il possible de fournir le logcat? – hoomi

+0

Pourrions-nous s'il vous plaît avoir l'erreur elle-même? – Joehot200

+0

Je suis désolé, je ne sais pas quelle erreur vous voulez dire –

Répondre

1

J'ai reconstruit mon projet de manière incrémentielle d'une manière que je trouve exactement la même, et le problème a disparu. Je suppose que je ne saurai jamais quel était le problème.

Questions connexes