Perdido con Maven y librerías Android

B

Estoy trasteando con pequeños programas en Android y quería probar unas cuantas librerías que he visto por GitHub. Mi problema es que en todas, en su documentación, hablan sobre Maven y Gradle para poder incoporarlas en los proyectos Eclipse, pero no tengo ni pajolera idea de como utilizar estas herramientas.

Me he descargado Maven, configurado todas las variables de sesión, he instalado el plugin de Maven de Eclipse y añado las dependencias a las librerías que quiero utilizar, pero me saltan montones de errores de por ejemplo clases que no se encuentran.

Un ejemplo de librería que quería probar es la siguiente: https://github.com/blazsolar/FlowLayout

Entonces, mis preguntas son, ¿siempre que tengo que utilizar librerías por Maven, tengo que transformar mi proyecto actual de Android a Maven? Esto último lo he conseguido hacer desde botón derecho sobre el proyecto, Configure, Convert to Maven project. Pero luego al ejecutar, el programa que antes me funcionaba correctamente, al transformarlo a Maven me saltan errores.

¿No sería más fácil distribuir la librería como *.jar y punto? Es que no entiendo a qué viene tanta complicación.

Luego a parte, por ejemplo el enlace que he puesto de GitHub, descargo el Zip, importo esa carpeta como proyecto Eclipse y en vez de aparecer las clases android en "src/" aparecen en "java". Después, en el proyecto que estoy haciendo para probar las librerías, añado ese proyecto como librería al proyecto actual, y me sigue sin funcionar porque no detecta algunas clases.

Luego he probado a bajarme otras librerías distintas y más de lo mismo. Todo Maven y ahora mismo eso me parece una mierda. xD

zoeshadow

A ver, por partes:

Todas las librerías que se encuentran en Maven, te permiten también descargarte el .jar manualmente, pero obviamente es más cómodo poner la dependencia en el pom.xml, para descargarte una librería de MavenCentral ( el repositorio central que susa maven ) tienes que ir a esta página y buscar la librería.

En este caso la que quieres se encuentra en esta dirección, pero hay un problema más, esta librería no está en un .jar, sino en un .aar, es un tipo de librería especial de Android que a parte de código fuente también incluye recursos de Android, y si te digo la verdad, no tengo ni idea como añadir directamente .aar a Eclipse, pero seguramente en Google te digan cómo.

Por último, te recomiendo que no gastes el tiempo con Maven, ya que Google ha elegido Gradle como la herramienta de builds oficial de Android, por lo que seguramente te sea más facil pasarte a Gradle directamente.

Gradle utiliza por debajo las dependencias de MavenCentral, la única diferencia es la notación que se usa para añadir dependencias:

En Maven sería:

<dependency>
	<groupId>com.wefika</groupId>
	<artifactId>flowlayout</artifactId>
	<version>0.3.4</version>
</dependency>

Y en Gradle:

compile 'com.wefika:flowlayout:0.3.4'
1 respuesta
Lecherito

Yo también me peleé con eso, al final lo que hice fue copiarme el repo y a tomar por saco, en mi trabajo no quieren Gradle ni Maven

2 respuestas
JuAn4k4

tengo que transformar mi proyecto actual de Android a Maven?

Si, en realidad lo que estas haciendo es decirle a Eclipse : Hey, que estoy usando maven, echale un ojo al pom.xml para buscar las dependencias. (Creo recordar que eclipse no era muy bueno con esto)

¿No sería más fácil distribuir la librería como *.jar y punto?

Si estas tu solo a lo mejor, pero cuando hay más gente involucrada, basta con poner en la configuración qué version de que librerías usas (ya sea en Maven o Gradle) y ya está, en realidad es mucho más cómodo usar Maven/Gradle que tener que bajarte los .jar

Importar libreria

Yo lo que hago es buscar el nombre de la libreria + maven en google, y suele llevarte a mvnrepository.com/.... (Si está en el repositorio de maven) para ver que tienes que poner en el pom.xml o donde sea.

Una vez compilas con maven, se descarga todos los .jar necesarios y te los pone en:
/.m2/repository/..... (creo que era algo así, donde ~ es por defecto la carpeta de tu usuario)

A veces en esta web tienes el link de descarga al "jar", pero en este proyecto tienes a Github.
En github tienes dos opciones :
1) Bajarte el codigo fuente y compilarlo tu mismo (por si haces cambios o lo que quieras que para eso es open-source) Que se hace o bien clonando el repositorio en tu local, o bajandote el zip como haces.

2) Descargarte las releases que pongan ellos (https://github.com/ApmeM/android-flowlayout/releases ) que las tienes en la pestaña de Releases, a veces se pone como descargas, y ahi tienes el .jar/.aar o lo que sea.

2 respuestas
B

#2, #3, #4 Muchísimas a todos. Con las respuestas que me habéis dado me ha quedado mucho más claro. Como quien dice empecé ayer con ésto y hay muchos conceptos que se me escapan.

La verdad que muy mal encaminado no iba ya que todas las instrucciones que me habéis dado las he hecho correctamente, sin embargo, probando más cosas, creo que ahora en realidad no es problema de Maven sino alguna otra cosa que estaré haciendo mal ya que ahora clono el repositorio de Github, añado el proyecto como librería y sigo obteniendo el mismo error.

Me he pateado decenas de respuestas de Stackoverflow, he probado todas las soluciones planteadas y sigo con los mismos resultados.

El error que obtengo es el siguiente:

Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apmem.tools.layouts.FlowLayout" on path: DexPathList[[zip file "/data/app/org.apmem.tools.example-2.apk"],nativeLibraryDirectories=[/data/app-lib/org.apmem.tools.example-2, /vendor/lib, /system/lib]]

Para explicaros un poco lo que estoy haciendo... Como os dije tengo planeado implementar una librería un proyecto actual. Total que me he creado un Workspace a parte, para hacer pruebas, y trastear todo lo que quiera. He cambiado la librería que os puse más arriba por otra distinta pensando ya que a lo mejor su autor había cometido algún error. La librería es esta: Librería

En ese repositorio está tanto la librería como un ejemplo práctico de cómo usarla. Total, como tengo clonado el repositorio, importo los dos proyectos, al proyecto de ejemplo incorporo como librería desde el Build Path el proyecto que actúa como tal, limpio el workspace, ejecuto y SIEMPRE obtengo ese error.

He probado 3 o cuatro librerías y siempre me salta el mismo error. A la desesperada he copiado el código de la librería al propio proyecto de ejemplo y ahí sí consigo hacerlo funcionar. Pero cuando establezco dependecias entre proyectos, ahí es cuando me vienen los problemas.

Os he subido a mega el workspace entero a ver si me podéis echar una mano porque no encuentro la solución. Workspace

He probado:

  • En el pestaña Order and export marcar la casilla de la librería del proyecto.
  • En la misma pestaña, he movido a todas las posiciones posibles el proyecto.
  • Algunos sugerían, en esa pestaña, desmarcar la casilla Android Dependencies, y sigo igual.

No sé como una cosa tan sencilla puede dar tantos problemas. No sé si ya es cosa de Android, de Eclipse...

1 respuesta
zoeshadow

#3 > en mi trabajo no quieren Gradle ni Maven

huye

#4 No tengo ni idea de como funciona Eclipse, así que con eso no te puedo ayudar, si al final lo estás haciendo con Maven ( me ha parecido entender? ) prueba a intentar compilar desde la linea de comandos ( mvn clean install )

1 respuesta
B

He optado a hacerlo sin él. Cuando consiga volver a hacerlo funcionar probaré con él.

Lecherito

#6 En noviembre empiezo otro, ya he salido por patas.

JuAn4k4

#5 Al hacerlo con Maven otra de las ventajas es las dependencias de otras librerías:

Tu importas la libreria A con maven, y si esta A necesita de B y C, se descargan también, y se añaden al proyecto.

Puede que al bajarte únicamente el .jar suyo, falten otras cosas.

A parte de esto, es posible que en tu pom.xml te falte la referencia a alguna librería de Android (no se que es DexPathList, pero parece que es una clase que esta en alguna librería del sistema, parece que esta: http://mvnrepository.com/artifact/com.google.android/android/4.1.1.4 )

Si miras en el pom.xml de FlowLayout tienen esto:

<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>${android.version}</version>
</dependency>

Igual tu no la tienes, y la clase que te falta esté ahi.

PD: Son todo suposiciones.

B

Pues podria ser. Luego a la tarde lo miro que no estoy en casa aunque vamos, que yo recuerde el sdk de android venia con android 4.4... De todas formas muchas gracias por la ayuda. Me anoto el truco ese de ver los pom. Ya comentare.

Edit: He eliminado Android 4.4.2., lo he descargado todo nuevo, he creado hasta los proyectos de nuevo y continúa igual. Maven ya no lo utilizo, he descargado directamente el respositorio y nada de nada. Debe ser que no sé importar librerías porque sino... xD

Edit2: Solucionado. He cambiado el método para usar proyectos externos como librerías. Ahora en vez de hacer:

botón derecho sobre el proyecto -> Build Path -> Projects -> Add Project

Ahora, sobre el proyecto que actúa como librería:

Botón derecho sobre el proyecto que actúa como librería -> Properties -> Android -> Activar checkbox "Is Library"

Después sobre el proyecto donde emplearé la librería:

Botón derecho sobre el proyecto que actúa como librería -> Properties -> Android -> Add library -> Seleccionar el proyecto del paso anterior

No entiendo como en todas las preguntas que he visto en Stackoverflow, dicen que se haga de vez como lo he hecho desde el principio. Muchas gracias a todos.

bLero

La integración de Maven con eclipse es una mierda, de hecho, prefiero hacerlo todo por línea de comandos que utilizar el plugin embedido en el IDE.

Por otro lado, como dicen por arriba, Google está utilizando Gradle en todos sus proyectos, así que aunque no sea santo de mi devoción yo intentaría pasarme.

La verdad que cuesta entender cómo, después de muchos años con Android aún no hay un IDE pulido para desarrollar aplicaciones:

  • Eclipse está lleno de bugs: prueba a poner un acento en la ruta relativa al workspace y verás que pasa :D
  • Android Studio (basado en IntelliJ) aún está muy verde y no han mejorado apenas nada desde su lanzamiento donde prometía mucho.
1 respuesta
zoeshadow

#11 Yo he desarrollado una aplicación con IntelliJ y otra con Android Studio ( 6+ meses de trabajo entre las dos ), una maven y la otra gradle, y creo que ambos IDE's están listos para ser usados en proyectos reales, tienen algunos fallos pero son de lejos lo mejor para desarrollar en Android.

El problema es que tienen "gotchas" que como te muerdan pierdes tardes y tardes, una vez los conoces no vuelves a Eclipse ni con una pistola en la sien..

1

Usuarios habituales