Pregunta

Puede que no sea una buena práctica, pero existen formas de eliminar clases no utilizadas de archivos jar de terceros.Algo que analiza la forma en que mis clases usan la biblioteca y hace algún tipo de análisis de cobertura, luego escupe otro frasco con todas las clases intactas eliminadas.

Obviamente hay problemas con esto.Específicamente, el escenario de uso que presenté puede no usar todas las clases todo el tiempo.

Pero ignorando estos problemas, ¿se puede hacer en principio?

¿Fue útil?

Solución

Hay una manera.

El proyecto JarJar hace esto AFAIR.El primer objetivo del proyecto JarJar es permitir incrustar bibliotecas de terceros en su propio jar, cambiando la estructura del paquete si es necesario.Al hacerlo, puede eliminar las clases que no son necesarias.

Compruébalo en http://code.google.com/p/jarjar/.

Aquí hay un enlace sobre frascos que se encogen: http://sixlegs.com/blog/java/jarjar-keep.html

Otros consejos

Hay una herramienta en Ant llamada classfileset.Usted especifica la lista de clases raíz que sabe que necesita y luego el conjunto de archivos de clase analiza recursivamente su código para encontrar todas las dependencias.

Alternativamente, podría desarrollar un buen conjunto de pruebas que ejerza todas las funciones que necesita y luego ejecutar sus pruebas con una herramienta de cobertura de pruebas.La herramienta le dirá qué clases (y las declaraciones contenidas en ellas) se utilizaron realmente.Esto podría brindarle un conjunto de código aún más pequeño que el que encontraría con el análisis estático.

yo suelo ProGuard para esto.Además de ser un excelente ofuscador, tiene una fase de reducción de código que puede combinar varios JAR y luego eliminar las clases o miembros de clase no utilizados.hace un excelente trabajo de encogerse.

En un trabajo anterior, utilicé un ofuscador de Java que, además de ofuscar el código, también eliminaba clases y métodos que no se estaban utilizando.Si estaba haciendo "Class.byName" o cualquier otro tipo de cosas de reflexión, necesitaba decirle al ofuscador porque no podía saber, al inspeccionar el código, qué clases o métodos llamaban mediante reflexión.

El problema, por supuesto, es que no sabes si otras partes de la biblioteca de terceros están reflexionando, por lo que eliminar una clase "no utilizada" podría provocar que las cosas se rompan en un caso oscuro que no has probado.

jar es solo un archivo zip, así que supongo que puedes hacerlo.Si pudieras llegar a la fuente, estaría más limpio.¿Quizás intentar desmontar la clase?

Además de esta pregunta, ¿puede eso mejorar el rendimiento?¿Dado que las clases no utilizadas no se compilarían JIT mejorando el tiempo de inicio o Java lo detecta automáticamente mientras se compila en código de bytes y ni siquiera maneja el código que no se usa?

Este sería un proyecto interesante (¿alguien lo ha hecho ya?)

Supongo que le daría a la herramienta su(s) frasco(s) como punto de partida y el frasco de la biblioteca para limpiarlo.Podría usar la reflexión para determinar a qué clases hacen referencia directamente sus archivos jar y cuáles se usan indirectamente en el árbol de llamadas (esto no es nada trivial, pero es factible).Si encuentra algún código de reflexión en cualquiera de los dos lugares, debería dar una advertencia muy fuerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top