2012-05-14 19 views
15

tengo tal vez esta configuración no es tan común:proyecto de construcción Android con tener hormiga una dependencia proyecto de biblioteca en otro proyecto de biblioteca

(> = dependencia)
proyecto Android> proyecto de biblioteca Android 1> proyecto de biblioteca Android 2
Tengo un proyecto de biblioteca Android que tiene una dependencia con otro proyecto de biblioteca.

Cuando estoy construyendo un proyecto en Eclipse todo funciona bien pero no puedo hacer que mi compilación funcione con Ant.

First Ant compila el proyecto de biblioteca Android 2 que genera un classes.jar y coloca este archivo en la carpeta bin.
Entonces Hormiga intenta compilar el proyecto de biblioteca Android 1 pero luego que estoy recibiendo errores lástima pues le falta clases de proyecto de biblioteca Android 2.

Bueno esto no es tan raro lástima pues el archivo JAR no está incluido en las librerías carpetas. Pero en project.properties hice una dependencia al proyecto de la biblioteca 2, entonces, ¿por qué Ant no copia el classes.jar a las carpetas libs del proyecto de biblioteca 1?

Bueno, puedo pensar en una solución para usar una tarea Ant para copiar el archivo a la carpeta libs, pero luego tengo que modificar el build.xml que no prefiero.

** EDITAR

El problema es que la clase I no se encuentra, cuando me miro en classes.jar este archivo Java no contiene la clase R. Entonces mi solución probablemente no funcionaría.

+0

Tiene el mismo problema. Recientemente, intenté recompilar un proyecto anterior con las herramientas sdk actuales y solucionar este problema. Anteriormente, cuando el compilador utilizaba el código fuente fusionando esto no era un problema, pero ahora compila jar y, por alguna razón, deja de lado la clase R. Ninguna de las "respuestas" son respuestas reales. En mi caso, tengo una versión paga y gratuita de la aplicación y uso el patrón recomendado de tener dos proyectos y una biblioteca común. No veo como un buen patrón que los proyectos de nivel superior deben administrar todas las dependencias de la biblioteca común. –

Respuesta

1

Para que la hormiga compile agregue dependencia en ant.properties. por ejemplo:

android.library.reference.1=../path/to/library 
+1

Sí, he hecho esta referencia. Esto funciona para un proyecto normal de Android, pero no cuando hago una referencia de un proyecto de biblioteca a otro proyecto de biblioteca. – user1051892

+0

¿Agregaste ant.properties en tu proyecto de biblioteca? También puede intentar actualizar el proyecto de la biblioteca ejecutando '" Proyecto de actualización android -l "lib ref" -p .' en su carpeta raíz ref lib – Tarun

+0

El proyecto udpate de Android no creó una ant.properties. manual pero nada ha cambiado. No sé si la hormiga lee el archivo porque estoy compilando desde otra carpeta (proyecto normal de Android) – user1051892

1

Esto suena como una configuración muy frágil - es posible que tenga una buena razón para esto, pero podría usted en lugar desacoplar la dependencia de las bibliotecas el uno del otro?

Por ejemplo; implemente un bridge pattern para traducir las llamadas entre ambas bibliotecas y haga que el proyecto de Android que llama las adjunte. De esta forma, no tiene código en ninguna biblioteca que dependa de la otra, y el único proyecto que necesita manejar la configuración de dependencia es su proyecto principal.

Una de las principales razones para usar una biblioteca es hacer que el código se vuelva a usar, este enfoque garantiza que alguien (usted, un colega, su sucesor ...) pueda conectar solo una biblioteca y crear su propia implementación de el otro.

Aquí es otro buen artículo sobre la aplicación del modelo de puente en Java: http://java.dzone.com/articles/design-patterns-bridge

1

Bueno, el problema era que la clase R faltaba.
Así que eliminé la dependencia de la clase R entre los dos proyectos de la biblioteca.
No sé si esto se puede solucionar, pero creo que es una mala práctica de todos modos.

Sin esta dependencia Ant construye bien.

2

Este comportamiento fue causado por un cambio en el R17 de las herramientas de construcción: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

En pocas palabras: los archivos de R para las bibliotecas ya no son empaquetadas en el classes.jar para esa biblioteca.Sin embargo, dado que pareent.R para la biblioteca principal (project1 en su ejemplo) también contiene las referencias de recursos para la biblioteca 'child' (project2 en su ejemplo), no tiene que hacer referencia a la R de child de todos modos .

Reemplace todas las instrucciones de project2.R-import en project1 con las instrucciones de importación de project1.R y debería estar bien.

0

vieja pregunta, pero como yo, otros podrían estar golpeando su cabeza en este ...

La respuesta oficial es que "no se puede hacer", específicamente:

Al tiempo de construcción, la las bibliotecas se fusionan con la aplicación de a una por vez, comenzando desde la prioridad más baja hasta la más alta. Tenga en cuenta que una biblioteca no puede hacer referencia a otra biblioteca y que, en tiempo de compilación, las bibliotecas no se fusionan entre sí antes de fusionarse con la aplicación.

(extraída de la documentación oficial: "Referencing a Library Project").

Lo que significa que todo vale, ya que no hay una manera "limpia" de hacerlo con las herramientas (y los métodos sucios están en orden).

Espero que ayude

Cuestiones relacionadas