2012-03-29 9 views
5

Estoy tratando de incluir Cocos2d en una aplicación preexistente. He hecho cosas de la manera Eclipse, como el establecimiento de "isLibrary" y añadiendo el proyecto de la biblioteca a la trayectoria de la estructura en Eclipse, y tengo la siguiente dependencia en el de mi aplicación pom.xml:Agregar un proyecto de "Biblioteca de Android" de Eclipse y construir a través de Maven

<dependency> 
    <groupId>cocos2d_android</groupId> 
    <artifactId>cocos2d_android</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <scope>provided</scope> 
</dependency> 

pensé que esto sería' Me he encargado del problema, pero cuando lo construyo, la biblioteca parece no estar incluida. Lo sé porque cuando comienzo una actividad, SimpleGame, haciendo referencia a una de las clases en la fuente cocos2d, la actividad se muere y me sale este StackTrace en DDMS:

E/AndroidRuntime(10621): FATAL EXCEPTION: main E/AndroidRuntime(10621): java.lang.NoClassDefFoundError: org.cocos2d.opengl.CCGLSurfaceView E/AndroidRuntime(10621): at com.xyz.game.SimpleGame.onCreate(SimpleGame.java:22) ...

estoy buscando dos cosas:

1) una forma fiable de saber si una clase determinada/jar/lo que estaba empaquetada en mi apk, como los pasos para llegar a este punto en mi aplicación son largos y complicados en este momento

2) Algo en el Manifiesto o pom.xml para la aplicación principal o el proyecto de la biblioteca parece que falta - s Se necesita algo para decirle a Maven que elija este otro proyecto. ¿Qué es eso?

Estoy usando Maven 3.0.4 y 3.0.0-alpha-13 del complemento, compilando para el nivel 8 en adelante.

Respuesta

4

1) una forma fiable de saber si una clase determinada/jar/lo que estaba empaquetada en mi apk, como los pasos para llegar a este punto en mi aplicación son largos y complicados en este momento

proyecto de construcción de la línea de comandos (es decir mvn instalación limpia), Maven salida registros detallados durante cada fase/meta de acumulación, en el objetivo dex, se puede ver algo como esto:

[INFO] --- android-maven-plugin: 3.1.1: dex (default-dex) @ myproject ---
[INFO] C: \ Archivos de programa \ Java \ jdk1.6.0_21 \ jre \ bin \ java [-Xmx1024M, -jar, C: \ Progr am Archivos \ Android \ android-sdk-r16 \ plataforma-herramientas \ lib \ dx.jar, --dex, --output = C: \ workspace \ myproject \ target \ classes.dex, C: \ workspace \ myproject \ target \ classes, C: \ maven \ repository \ cocos2d_android \ cocos2d_android \ 1.0.0-SNAPSHOT \ cocos2d_android-1.0.0-SNAPSHOT.apklib, C: \ maven \ repository \ com \ google \ code \ GSON \ GSON \ 1.7.1 \ GSON-1.7.1.jar, ... ...]

El Proyecto Biblioteca Android es realmente dex-ed como cocos2d_android-1.0.0 -SNAPSHOT.apklib con algunos otros archivos regulares de la biblioteca jar.


2) Algo en el manifiesto o pom.xml, ya sea para la aplicación principal o el proyecto de biblioteca que parece faltar - algo necesario para señalar a Maven para recoger este otro proyecto - lo que es ¿eso?

Es ApkLib, que es simplemente un archivo zip del Proyecto Biblioteca Android (src /, res /, y AndroidManifest.xml etc.). Por lo general, creamos/implementamos nuestro propio Proyecto de Biblioteca Android con el Proyecto Android dependiente como proyecto maven multi-módulo, sin embargo, esto no es necesario en caso de que necesite un Proyecto de Biblioteca Android de referencia escrito por otros desarrolladores. Gracias a la promotora, android-experto-plugin ya ha apoyado los no-Maven Android Biblioteca Proyectos, echa un vistazo a Compatible with non-Maven Android Library Projects:

El archivo .apklib generado tendrá el diseño de un proyecto de biblioteca estándar de Android/Eclipse. Esto significa que, independientemente de su diseño Maven, el diseño dentro del archivo .apklib será ese código fuente en "src /" en lugar de "src/main/java /", pero aún se interpreta correctamente cuando se usa en una aplicación Android/Maven proyecto. Esto debe ser compatible con los proyectos de biblioteca de los desarrolladores que no son de Maven, lo cual es importante para hacer crecer la comunidad de desarrolladores de Android. bibliotecas

Use otros desarrolladores no Maven

También significa que podemos tomar cualquier archivo zip proyecto de biblioteca Android externa (de los desarrolladores no Maven) y hacer una instalación mvn: instalar archivos en ... y simplemente comienza a usarlo como una dependencia.

Compartir su .apklib con los desarrolladores no Maven

Para compartir el archivo de .apklib con un desarrollador no Maven, es probable que se sienta más cómodo si se cambia el nombre a .zip. Luego pueden simplemente descomprimirlo en un directorio y usarlo desde allí.

Así que la solución es:

  1. Paquete de su proyecto de Biblioteca Android en archivo zip correctamente, a continuación, cambie su nombre por something.apklib.
  2. Instale something.apklib en su repositorio local de Maven utilizando mvn install: install-file.
  3. en cualquier proyecto que requiera la dependencia Android Biblioteca, simplemente usando:

    <dependency> 
        <groupId>cocos2d_android</groupId> 
        <artifactId>cocos2d_android</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <type>apklib</type> 
    </dependency> 
    

Salida Samples en el sitio web android-maven-plugin para ver cómo utilizar apklib correctamente.

+0

Gracias yorkw!¿Aunque hay una forma de que Maven se acerque y cierre el proyecto? Mi copia de cocos2d es un clon de solo lectura de github y me encantaría la conveniencia de no repetir este proceso cada vez que sale un cambio de github ... –

+0

No sé si hay plugins maven que puedan hacer pull, zip e instalar automáticamente desde github. ¿Con qué frecuencia actualizarás tu aplicación? Desde una perspectiva productiva, es poco probable que uno necesite mantener/actualizar las dependencias de las aplicaciones requeridas en una base diaria o semanal regular. La solución manual es la única forma en que se proporciona android-maven-plugin y creo que es aceptable para el mantenimiento productivo en la mayoría de las condiciones. – yorkw

+0

nota rápida: al hipervínculo "Ejemplos" anterior le faltan las "s" finales (debería ser http://code.google.com/p/maven-android-plugin/wiki/Samples). SO no me dejaría hacer una edición de 1 carácter. –

1

El alcance no debe ser provided. medios previstos:

proporcionado - esto es muy similar a la compilación, sino que indica que espera el JDK o un recipiente para proporcionar en tiempo de ejecución. Solo está disponible en el classpath de compilación y prueba , y no es transitivo.

Uso compile lugar.

Consejo adicional: como compile es el valor predeterminado, puede eliminar la línea <scope>provided</scope>.

+0

Es curioso que tengas que mencionar que, utilizando el valor predeterminado 'compile', obtengo un error de entrada duplicado cuando intento compilar el archivo .apk. Obviamente, tengo una especificación de dependencia adicional en alguna parte, pero no estoy seguro de dónde, ya intenté eliminar el proyecto de la ruta de compilación en eclipse, no estoy seguro de qué más probar. –

+0

@BryM. esto podría deberse a una dependencia en el cocos2d_android que ya existe en la biblioteca de Android. Probablemente pueda encontrar la clase duplicada en su classpath y usar la etiqueta de dependencia Maven para podar la dependencia redundante de cocos2d_android. –

Cuestiones relacionadas