2011-02-09 30 views
13

Cuando intento exportar mi apk con Proguard tengo una gran cantidad de errores (más de 400) similares a:Proguard problemas con archivos jar, ¿cómo encontrar el jar faltante?

Warning: org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper: can't find superclass or interface javax.ws.rs.ext.ExceptionMapper 

y

org.codehaus.jackson.xc.DataHandlerJsonDeserializer$1: can't find superclass or interface javax.activation.DataSource 

estoy usando el Jackson Json library, y los errores parecen estar relacionados a ese.

investigando este error me encontré con lo siguiente de Proguards FAQ:

Si hay referencias no resueltas a clases o interfaces, es muy probable que se olvidó de especificar una biblioteca esencial. Para un procesamiento adecuado, se deben especificar todas las bibliotecas a las que hace referencia su código, incluida la biblioteca de tiempo de ejecución de Java. Para especificar bibliotecas, use la opción -libraryjars.

Buscando en el SO me encontré con un montón de preguntas sin respuestas relacionadas con este, pero la sensación general era que el archivo jar que estoy usando (en este caso Jackon JSON) se apoya en más bibliotecas y necesitan ser agregado al archivo de configuración de Proguard de alguna forma.

Sin embargo, no puedo encontrar la manera de determinar qué frascos se necesitan y dónde se encuentran. Las advertencias mencionar una gran cantidad de diferentes paquetes como javax.ws.rs.ext, org.joda.time, org.codehaus.stax2, javax.xml.stream, etc.

  1. ¿Cómo determino lo tarros contener esos paquetes? Por ejemplo, ¿qué jar se requiere para las clases javax.ws.rs.ext. **?
  2. ¿Cómo averiguo dónde están esos frascos y qué ruta usaría con -libraryjars en Proguard?

Gracias mucho


Editar: que deben también mencionar que estoy usando una configuración Android Library Project. Los archivos jar están en el proyecto principal de la Biblioteca, y el proyecto real de trabajo tiene sus rutas de compilación incluidas las jarras en el proyecto de la Biblioteca. No sé si eso hace una diferencia, pero pensé que debería mencionarlo.


actualización sólo para probar, que elimina por completo los Jackson lejos de la trayectoria de la estructura y de mi código y ahora Proguard finaliza correctamente. Las preguntas siguen siendo ... ¿Cuál es el enfoque correcto para manejar estos errores?

¿El asistente de exportación de Android en Eclipse agregar automáticamente el directorio/lib/frascos de PROGUARD o hacer que todos tienen que ser añadido manualmente en el archivo de configuración Proguard así:

-libraryjars C:/Project/lib/somjar.jar 

Yo probé que para el jackson uno pero no hizo ninguna diferencia. ¿Esto significa que también tengo que encontrar todos los frascos que se necesitan para las clases mencionadas en las advertencias y agregarlas? ¿Estarían en el SDK o en la instalación de Java?

Lo siento si estas son preguntas estúpidas, pero he estado tratando de resolver esto durante las últimas dos horas y no tengo ni idea de qué hacer.

Gracias de nuevo


actualización de nuevo

Así que más la búsqueda, combinado con la sugerencia de Benjamín, he encontrado algunas de las clases que faltan estaban en rt.jar, que está en carpeta de la liberación del JDK . Así que acabé añadiendo

-libraryjars <java.home>/lib/rt.jar 

Para el archivo proguard.cfg y traje de las advertencias de 485 a 204. Hey, yo supongo que es algo ... Las advertencias restantes describen las clases que no puedo encontrar en absoluto. La aplicación funciona bien sin ejecutar proguard, por lo que estas clases deben estar en algún lugar ¿verdad? ¿O son estas advertencias con las que debería usar -dontwarn?

Las restantes clases son en estos paquetes:

org.joda.time. 
org.codehaus.stax2. 
javax.ws.rs. 

Así que ahora sólo necesito una manera de averiguar:

  1. Lo frascos tienen estas clases
  2. ¿Dónde están estos frascos por lo que puede incluirlos en el archivo de configuración proguard
+0

La primera página de Jackson que enlazas especifica que Jackson tiene ** dependencia ** externa. ¿Estás seguro de que el problema es con Jackson JSON? – SyntaxT3rr0r

+0

@Syntax, eso es lo que pensé, pero las 485 advertencias son * org.codehaus.jackson.something: no se puede encontrar la clase referenciada something.else * Ninguna de las otras bibliotecas que estoy usando da advertencias. Sin embargo, en respuesta a tu pregunta, no, no estoy seguro de que el problema sea con Jackson. Simplemente no tengo otras pistas en este punto. – cottonBallPaws

Respuesta

5

que he tenido problemas similares con Proguard y errores similares que estaba usando una osmdroid.jar que construyó OK no confundido. Este jar debe haber tenido dependencias externas que mi aplicación no necesitaba. Afortunadamente, los autores enumeraron los frascos necesarios y una vez que los descargué y le dije a Proguard a través de la opción -libraryjars, la compilación de Proguard estaba bien.

Re sus tarros que faltan (que es probable que realmente no necesita, pero Proguard cree que usted podría!), Se debe encontrar en:

org.joda.time (El frasco del interior de la cremallera)

org.codehaus.stax2.

javax.ws.rs.

+0

Esto funcionó, ¡gracias! Los descargué a un directorio fuera de mi proyecto y les agregué la ruta completa en el archivo proguard.cfg como * -libraryjars C: /FullPathTo/JarLocations/jar.jar* y finalmente pude completarlo. Voy a dejar esto sin respuesta durante el resto del día en caso de que alguien más tenga algo más que agregar sobre este tema. Gracias de nuevo. – cottonBallPaws

3

Solo puedo proporcionar una respuesta para t que primera parte: Dale

http://www.findjar.com

una oportunidad, no es posible encontrar los nombres de los archivos jar necesarios like so

+0

@Laurel: ¡gracias por avisarme! –

+0

¡Ningún problema! Es parte de un [proyecto más grande] (http://meta.stackoverflow.com/questions/321494) para limpiar enlaces cortos. Me alegro de que alguien finalmente reconoció uno de mis comentarios. – Laurel

0

no es necesario incluir las bibliotecas para Proguard; en su lugar, debes instruir a Proguard para que guarde los nombres de las clases y algunas otras cosas. Jugué un rato con él un poco a mí mismo, y terminé con algo similar a this discussion:

-keepnames class org.codehaus.** { *; } 
-keepattributes *Annotation*,EnclosingMethod 
-dontwarn org.codehaus.jackson.** 

Si usted todavía se producen fallos de — y sugeriría probar enérgicamente! — es posible que desee mantener Jackson completamente intacto con:

-keep class org.codehaus.** { *; } 
-keepattributes *Annotation*,EnclosingMethod 
-dontwarn org.codehaus.jackson.** 

(Tenga en cuenta que este último produce un archivo más grande.)

Cuestiones relacionadas