2012-06-29 15 views
5

Voglio passare a Maven per il mio processo di compilazione nello sviluppo Android. Ho seguito http://www.sonatype.com/books/mvnref-book/reference/android-dev-sect-archetype.html per creare il pom.xml e aggiustato la versione un po 'in modo da utilizzare l'ultima versione del plug-in di Android-maven.ClassNotFoundException in apk build con Maven

Mentre il mio apk viene compilato manualmente dall'interno del mio IDE (IntellJ), ci sono problemi con l'apk creato con Maven. Ovviamente manca qualcosa che non metta le classi nell'apk.

Quando controllo l'apk generato (decomprimendolo), , trovo che il file classes.dex dell'apk generato da Maven sia molto più piccolo (2.6kB) di quello normale (24.9kB). Ovviamente mancano le classi.

Così, quando si inizia questo apk, sto ottenendo il seguente errore:

E/AndroidRuntime(31228): FATAL EXCEPTION: main 
E/AndroidRuntime(31228): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mycompany.abc/com.mycompany.abc.ABCActivity}: java.lang.ClassNotFoundException: com.mycompany.abc.ABCActivity in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.abc-1/pkg.apk] 
E/AndroidRuntime(31228): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569) 
E/AndroidRuntime(31228): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
E/AndroidRuntime(31228): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
E/AndroidRuntime(31228): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
E/AndroidRuntime(31228): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(31228): at android.os.Looper.loop(Looper.java:130) 
E/AndroidRuntime(31228): at android.app.ActivityThread.main(ActivityThread.java:3683) 
E/AndroidRuntime(31228): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(31228): at java.lang.reflect.Method.invoke(Method.java:507) 
E/AndroidRuntime(31228): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
E/AndroidRuntime(31228): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
E/AndroidRuntime(31228): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(31228): Caused by: java.lang.ClassNotFoundException: com.mycompany.abc.ABCActivity in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.abc-1/pkg.apk] 
E/AndroidRuntime(31228): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) 
E/AndroidRuntime(31228): at java.lang.ClassLoader.loadClass(ClassLoader.java:551) 
E/AndroidRuntime(31228): at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
E/AndroidRuntime(31228): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
E/AndroidRuntime(31228): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561) 
E/AndroidRuntime(31228): ... 11 more 
W/ActivityManager(4964): Force finishing activity com.mycompany.abc/.ABCActivity 
W/ActivityManager(4964): Activity pause timeout for HistoryRecord{40902960 com.mycompany.abc/.ABCActivity} 

Questa è la mia pom.xml, su cui io uso: mvn install -P sign o mvn android:apk

<?xml version="1.0" encoding="UTF-8"?> 
<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>com.mycompany.abc</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>apk</packaging> 
    <name>com.mycompany.abc</name> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>2.2.1</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <!-- Simply read properties from file --> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>properties-maven-plugin</artifactId> 
       <version>1.0-alpha-2</version> 
       <executions> 
        <execution> 
         <phase>initialize</phase> 
         <goals> 
          <goal>read-project-properties</goal> 
         </goals> 
         <configuration> 
          <files> 
           <file>android.properties</file> 
          </files> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 

      <plugin> 
       <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
       <artifactId>android-maven-plugin</artifactId> 
       <version>3.2.0</version> 
       <configuration> 
        <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile> 
        <assetsDirectory>${project.basedir}/assets</assetsDirectory> 
        <resourceDirectory>${project.basedir}/res</resourceDirectory> 
        <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory> 
        <sdk> 
         <platform>11</platform> 
        </sdk> 
        <deleteConflictingFiles>true</deleteConflictingFiles> 
        <undeployBeforeDeploy>true</undeployBeforeDeploy> 
        <device>usb</device> 
       </configuration> 
       <extensions>true</extensions> 
      </plugin> 

      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 

      <plugin> 
       <artifactId>exec-maven-plugin</artifactId> 
       <groupId>org.codehaus.mojo</groupId> 
       <configuration> 
        <executable>${basedir}/scripts/run_app.sh</executable> 
       </configuration> 
      </plugin> 

     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <id>sign</id> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-jarsigner-plugin</artifactId> 
         <version>1.2</version> 
         <executions> 
          <execution> 
           <id>signing</id> 
           <goals> 
            <goal>sign</goal> 
           </goals> 
           <phase>package</phase> 
           <inherited>true</inherited> 
           <configuration> 
            <archiveDirectory></archiveDirectory> 
            <includes> 
             <include>target/*.apk</include> 
            </includes> 
            <keystore>/path/to/debug.keystore</keystore> 
            <storepass>android</storepass> 
            <keypass>android</keypass> 
            <alias>androiddebugkey</alias> 
            <arguments> 
             <argument>-sigalg</argument><argument>MD5withRSA</argument> 
             <argument>-digestalg</argument><argument>SHA1</argument> 
            </arguments> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
        <plugin> 
         <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
         <artifactId>android-maven-plugin</artifactId> 
         <inherited>true</inherited> 
         <configuration> 
          <sign> 
           <debug>false</debug> 
          </sign> 
         </configuration> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 

</project> 

risposta

13

trovato il problema:

<sourceDirectory>src</sourceDirectory> 

mancava nella sezione build. Chiedendosi però perché l'archetipo di Android (quando è in esecuzione archetype:generate) non lo includa già, poiché è piuttosto standard in Android.

+0

Hmm, quando aggiungo questo ottengo errori relativi a Junit non esistenti. Sembra che ora stia cercando tutto nella dir di src. Sto aggiungendo questo nella radice . È corretto? – conor

+0

sì, nella root , funziona bene per me. Forse questo è anche utile, non sono sicuro, ho solo cercato su google: https://groups.google.com/forum/?fromgroups=#!topic/maven-android-developers/kgUSnjTLHQg –

+0

Anche per me funziona come un incantesimo. Pensavo che Maven abbia usato src come directory di origine predefinita se non ne è stato fornito nessuno. Ma sono un po 'newbee riguardo Maven, sto ancora imparando più di quanto sto producendo :) – daffycricket

Problemi correlati