2011-11-03 20 views
17

Uso eclipse para el desarrollo de Google Android.NoClassDefFoundError en proyecto de biblioteca externa para Android

He creado un proyecto de biblioteca ([x] Is Library en la configuración de Android), que incluye un archivo jar externo (Bibliotecas de referencia). Este proyecto de biblioteca se referencia en otro proyecto (el proyecto real que utilizará el proyecto de la biblioteca). Esto se hace agregando el proyecto en la configuración de Android.

la fuente compila pero si quiero ejecutarlo en el dispositivo, tengo la NoClassDefFoundError para una clase que es dentro del frasco-archivo que se incluye en el proyecto de biblioteca.

Editar: El ist fichero-jar añadido a las entradas exportados ([x] my.jar en la Order and Export -Tab desde el proyecto de biblioteca)

¿Hay una manera limpia para conseguir este trabajo?

+0

¿está seguro de que la clase no encontrada se encuentra en el contenedor al que se hace referencia? hay una serie de problemas con las clases regulares de Java referenciadas por jar que están en SE de Java pero no están en Dalvik como algunos javax y todas las clases de lava.beans – kostja

+0

si está en el jar, ¿ha agregado el jar a los artículos exportados? – kostja

+0

@kostja: Sí, he modificado mi pregunta. – Fu86

Respuesta

15

Se ha indicado claramente en la API ofcial here:

Un proyecto de biblioteca puede incluir una biblioteca JAR

Puede desarrollar un proyecto de biblioteca que sí incluye una biblioteca JAR, sin embargo es necesario manualmente edite la ruta de compilación del proyecto de aplicación dependiente y agregue una ruta al archivo JAR

La jar lib debe agregarse manualmente a la aplicación dependiente pr oject, la ruta de compilación, no solo la propia ruta de compilación del proyecto de la biblioteca.

actualización de SDK r17:

Esto es manejado automáticamente por ADT ahora, echa un vistazo a la nueva función de ADT 17.0.0 liberación here:

característica añadido automáticamente las dependencias JAR configuración. Cualquier archivo .jar en la carpeta/libs se agrega a la configuración de compilación (similar a cómo funciona el sistema Ant build). Además, los archivos .jar necesarios para los proyectos de la biblioteca también se agregan automáticamente a los proyectos que dependen de esos proyectos de la biblioteca. (more info)

+1

esto significa que el proyecto principal que utiliza el proyecto de biblioteca que utiliza el archivo jar también debe tener el archivo jar en la ruta de compilación Java y marcarlo en la pestaña Orden y exportación ... Pasé bastante tiempo agregando los proyectos y archivos jar fue en vano ... construir bien, pero en tiempo de ejecución noclassdeffoundexception – Zennichimaro

1

Tuve un problema menor cuando actualicé a ADT17 donde mis libs no se estaban importando correctamente. ¡Resulta que esto se debe a que mis bibliotecas estaban siendo vinculadas como dependencias de mi carpeta lib no libs!

Parece librarys tienen que estar en la carpeta libs a partir de ahora

+0

Tenía lo mismo. Más detalles: http://stackoverflow.com/questions/9885971/new-android-sdk-17-issue-in-my-app – Remi

2

Ir a project properties -> build path-> libraies

Si usted ve sus archivos jar de la misma familia

snmp4j.jar - e:\software\jars 

su reunión de mayo su problema

Add libs en su proyecto y copie el archivo jar en esa carpeta. Haga clic con el botón derecho en el archivo jar e ingrese build path -> add to build path.A continuación se puede ver el frasco como

snmp4j.jar - project_name/libs 

Su trabajó para mí.

7

Para los que siguieron los pasos (incluso comprobar los proyectos en "Orden y de exportación") y todavía tienen la java.lang.ClassNotFoundException en el API 17, el último paso es comprobar que el compilador no se ejecuta con Java 1.7. Si es 1.7, entonces debe cambiarlo a 1.6 para todos sus proyectos. Después de que pedirá a reconstruir todos los proyectos y funcionó con éxito en mi teléfono :)

Para cambiar la versión de compilación de Java en Eclipse, este se encuentra en: Propiedades del proyecto> compilador Java> Nivel de conformidad Compilador: 1.6

+1

¿por qué deberíamos necesitar hacer esto? – Nezam

+0

+1 Excelente, esto solucionó el problema para mí. Aunque esto debería pasar en primer lugar ... –

+0

+1 Esto funcionó, pero en mi caso, fue que solo necesitaba una reconstrucción. Gracias. = D – Suzi

0

Otra cosa a tener en cuenta es el nombre de los paquetes de la biblioteca.

Si está utilizando ADT21 y le sucede que tiene bibliotecas que tienen el mismo nombre de paquete, habrá error durante la compilación pero seguirá compilar y ejecutar en Eclipse, que le da un APK que falta algunas de las clases de recursos . De ahí el bloqueo cuando ejecuta la aplicación.

Si lo compila con ANT, puede ver el error de compilación que dice que dos o más bibliotecas usan el mismo nombre de paquete.

Para resolver esto, cambie el nombre de su proyecto de biblioteca con las herramientas de Android -> Cambiar nombre de paquete de aplicación. Entonces todo volverá a la normalidad.

Me tomó casi todo el día para resolver esto ...

2

tenía dos proyectos que utilizan la misma biblioteca de trabajo: uno, el otro chocando con java.lang.NoClassDefFoundError. Después de que nada más me ayudó, busqué en el archivo project.properties en el directorio raíz de mi proyecto. El proyecto de trabajo tenía el android.library.reference línea (la última línea de abajo), el que no lo hizo chocar:

# Project target. 
target=android-17 
android.library.reference.1=../my-library-project 

que añaden manualmente la línea y que comenzó a trabajar! (Sí, lo hice probar ambos (proyecto) - propiedades ruta de compilación de Java - Proyectos y propiedades (proyecto) - Java Build Path - ordenar y exportaciones -. Nada ayudó)

PS Por cierto, "propiedades del proyecto" también tiene la pestaña "referencias del proyecto". No tengo idea de si funcionaría.

1

Tuve un problema similar y ninguna de las soluciones aquí lo solucionó.

Versión corta: el JAR se compiló en Java 1.7 y Dalvik no pudo encontrarlo.

Construimos un archivo JAR interno que compartimos entre clientes back-end y móviles con Maven. El problema terminó siendo que el JAR se compiló con Java 1.7. Androids dalvik solo es compatible con Java 1.5 y 1.6. Esta es la razón por la cual todo funciona bien en Eclipse ya que no está compilado para dalvik en este momento.

Incluso specified the target and source version in the Maven compiler plugin para compilar con Java 1.6. Esto no funcionó porque solo se instaló JDK 1.7 en la máquina de compilación.Una pequeña nota en la parte inferior de la página Maven nos dio la pista: Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

Para ver si usted tiene este problema, así, cambiar el nombre de su archivo *.jar a *.zip descomprimirlo, y buscar en el archivo MANIFEST.MF para el parámetro Build-Jdk: a mira qué versión de Java realmente compiló tu JAR.

Cuestiones relacionadas