2010-09-28 5 views
11

una aplicación que he escrito utiliza varios archivos jar de terceros. A veces, solo se usa una pequeña porción del frasco completo de 50kB a 1.7mB: una o dos llamadas o clases de funciones.Minimización de tamaños de dependencia jar

¿Cuál es la mejor forma de reducir el tamaño de los recipientes? ¿Debo descargar las fuentes y construir un contenedor con solo las clases que necesito? ¿Qué herramientas existentes pueden ayudar a automatizar esto (por ejemplo, miré brevemente al http://code.google.com/p/jarjar/)?

Gracias

EDIT 1: me gustaría reducir el tamaño de mi terceros frascos 'oficiales' como SwingX-1.6.jar (1.4 MB), set-3.6 (1.7 MB) glazedlists -1.8.jar (820KB), etc por lo que sólo contienen las clases mínimum las que necesito

Edición 2: Minimización de un frasco a mano o mediante el uso de un programa como Proguard se complica aún más si se utiliza la biblioteca reflexión. Injection with google guice does not work anymore after obfuscation with proguard

La respuesta por Cletus en otro post es muy bueno How to determine which classes are used by a Java program?

Respuesta

5

Proguard sería una opción. Puede eliminar clases y métodos no utilizados. También puede usarlo para ofuscar, lo que puede reducir aún más el tamaño de su jarra final. Tenga en cuenta que la carga de clases por nombre puede romperse, a menos que se tenga cuidado de mantener a las clases afectadas sin ser confundidas.

He encontrado Proguard bastante eficaz, puede ser un poco críptico para entender desde el principio. Pero no tengo ninguna experiencia similar para ofrecer una comparación.

+0

He usado Proguard para la ofuscación de mi jar de aplicación con buen resultado, y noté el tamaño de salida más pequeño. También me encontré con problemas con 'clases rotas' como mencionas, con objetos xstream, hasta que los agregué a la sección "mantener". Aunque no he usado Proguard para reducir el tamaño de mis jarrones de dependencia, ¿es esto posible? –

+0

@brian_d - sí, debería ser posible, utilizando -injars/-outjars. Supongo que el "nivel de dificultad" estará relacionado con la cantidad de jarras que tienes. Un ejemplo de uso que tuve fue de encriptación de bouncycastle. Solo pude incluir las clases que necesitaba, descartando todo el código para los algoritmos no utilizados, etc. –

+0

gracias por la sugerencia, voy a intentar esto. –

0

En primer lugar, si usa solo una clase del archivo JAR, esto no significa que esta clase no use otras clases de ese JAR. La opción para usted, si utiliza JAR de código abierto, es obtener las fuentes de ese JAR, adjuntarlas a su proyecto, eliminar cosas innecesarias y crear los cambios usted mismo.

+0

Todavía problemático como se menciona en mi 'Editar # 2'. Reduje el swingx a mano de 1.4MB a 160kB. Construyó bien, pero se bloqueó en la ejecución debido a varias llamadas de clase de método de reflexión que no se incluyeron. –

0

Puede agregar GenJar como tarea Ant y usarlo para compilar el JAR. Como se dice en la página principal de la biblioteca,

GenJar es una tarea Ant especializado que construye archivos jar basadas en la clase dependencias en lugar de simplemente los contenido de un directorio.

Lo puede encontrar en SourceForge.

+1

No recibo más que frustración con GenJar, con errores de "No se puede resolver".Parece que tampoco se ha actualizado desde 2003-03-06. –

+0

Descubrí que GenJar no se puede resolver problemas desapareció cuando utilicé Java 7 en lugar de Java 8 – Jon

Cuestiones relacionadas