La forma más fácil de combinar un lanzamiento en un archivo JAR

¿Hay alguna herramienta o script que combine fácilmente un grupo de archivos JAR en un solo archivo JAR? Una ventaja sería establecer fácilmente el manifiesto del archivo principal y hacerlo ejecutable.

El caso concreto es una herramienta de texto reestructurada de Java . Me gustaría ejecutarlo con algo como:

javajar rst.jar

Por lo que puedo decir, no tiene dependencias que indiquen que no debe ser una herramienta fácil de un solo archivo, pero el archivo ZIP descargado contiene muchas bibliotecas.

0 11-30-07 10:01 jrst-0.8.1/ 922 11-30-07 09:53 jrst-0.8.1/jrst.bat 898 11-30-07 09:53 jrst-0.8.1/jrst.sh 2675 11-30-07 09:42 jrst-0.8.1/readmeEN.txt 108821 11-30-07 09:59 jrst-0.8.1/jrst-0.8.1.jar 2675 11-30-07 09:42 jrst-0.8.1/readme.txt 0 11-30-07 10:01 jrst-0.8.1/lib/ 81508 11-30-07 09:49 jrst-0.8.1/lib/batik-util-1.6-1.jar 2450757 11-30-07 09:49 jrst-0.8.1/lib/icu4j-2.6.1.jar 559366 11-30-07 09:49 jrst-0.8.1/lib/commons-collections-3.1.jar 83613 11-30-07 09:49 jrst-0.8.1/lib/commons-io-1.3.1.jar 207723 11-30-07 09:49 jrst-0.8.1/lib/commons-lang-2.1.jar 52915 11-30-07 09:49 jrst-0.8.1/lib/commons-logging-1.1.jar 260172 11-30-07 09:49 jrst-0.8.1/lib/commons-primitives-1.0.jar 313898 11-30-07 09:49 jrst-0.8.1/lib/dom4j-1.6.1.jar 1994150 11-30-07 09:49 jrst-0.8.1/lib/fop-0.93-jdk15.jar 55147 11-30-07 09:49 jrst-0.8.1/lib/activation-1.0.2.jar 355030 11-30-07 09:49 jrst-0.8.1/lib/mail-1.3.3.jar 77977 11-30-07 09:49 jrst-0.8.1/lib/servlet-api-2.3.jar 226915 11-30-07 09:49 jrst-0.8.1/lib/jaxen-1.1.1.jar 153253 11-30-07 09:49 jrst-0.8.1/lib/jdom-1.0.jar 50789 11-30-07 09:49 jrst-0.8.1/lib/jewelcli-0.41.jar 324952 11-30-07 09:49 jrst-0.8.1/lib/looks-1.2.2.jar 121070 11-30-07 09:49 jrst-0.8.1/lib/junit-3.8.1.jar 358085 11-30-07 09:49 jrst-0.8.1/lib/log4j-1.2.12.jar 72150 11-30-07 09:49 jrst-0.8.1/lib/logkit-1.0.1.jar 342897 11-30-07 09:49 jrst-0.8.1/lib/lutinwidget-0.9.jar 2160934 11-30-07 09:49 jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar 301249 11-30-07 09:49 jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar 68610 11-30-07 09:49 jrst-0.8.1/lib/sdoc-0.5.0-beta.jar 3149655 11-30-07 09:49 jrst-0.8.1/lib/xalan-2.6.0.jar 1010675 11-30-07 09:49 jrst-0.8.1/lib/xercesImpl-2.6.2.jar 194205 11-30-07 09:49 jrst-0.8.1/lib/xml-apis-1.3.02.jar 78440 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar 86249 11-30-07 09:49 jrst-0.8.1/lib/xmlunit-1.1.jar 108874 11-30-07 09:49 jrst-0.8.1/lib/xom-1.0.jar 63966 11-30-07 09:49 jrst-0.8.1/lib/avalon-framework-4.1.3.jar 138228 11-30-07 09:49 jrst-0.8.1/lib/batik-gui-util-1.6-1.jar 216394 11-30-07 09:49 jrst-0.8.1/lib/l2fprod-common-0.1.jar 121689 11-30-07 09:49 jrst-0.8.1/lib/lutinutil-0.26.jar 76687 11-30-07 09:49 jrst-0.8.1/lib/batik-ext-1.6-1.jar 124724 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar 

Como puede ver, es algo deseable no necesitar hacer esto manualmente.

Hasta ahora solo he probado AutoJar y ProGuard, los cuales fueron bastante fáciles de ejecutar. Parece que hay algún problema con el grupo constante en los archivos JAR.

Aparentemente, el primero está ligeramente roto, así que intentaré arreglarlo. El archivo Maven pom.xml aparentemente también se rompió, así que tendré que arreglarlo antes de solucionarlo … Me siento como un imán de error 🙂


Actualización: nunca llegué a arreglar esta aplicación, pero revisé el “asistente de exportación Runnable JAR” de Eclipse , que está basado en un JAR gordo. Encontré esto muy fácil de usar para implementar mi propio código.

Algunas de las otras excelentes sugerencias podrían ser mejores para las comstackciones en un entorno que no sea de Eclipse. Probablemente debería hacer una buena comstackción usando Ant . (Maven, hasta ahora me acaba de dar dolor, pero a otros les encanta).

Asistente de exportación JAR ejecutable de Eclipse 3.4 JDT.

En Eclipse 3.5, esto se ha extendido. Ahora puede elegir cómo desea tratar sus archivos JAR referenciados.

El zipfileset de Ant hace el trabajo

     

Después de haber probado algunas soluciones diferentes, encontré que One-JAR es el más fácil de trabajar, y he logrado hacer exactamente eso: producir un único JAR ejecutable que contiene todo lo que necesito.

One-JAR utiliza un cargador de clases personalizado que puede navegar por los recursos nesteds. Mire el archivo .bat en la descarga, parece que org.codelutin.jrst.JRST en el archivo jrst-0.8.1.jar es la clase principal, por lo que su manifiesto debería verse así:

 Main-Class: com.simontuffs.onejar.Boot One-Jar-Main-Class: org.codelutin.jrst.JRST 

Lo realmente genial es que One-JAR se encargará de transmitir los argumentos de línea de comandos para usted. Classpath es manejado por el cargador de clases personalizado, suponiendo que todos los recursos que necesita están agrupados en el único JAR.

La forma más fácil de usar One-JAR es con ant; hay una tarea de ant personalizada “one-jar” que funciona de la siguiente manera (suponiendo que su manifiesto se llame “rst.mf”):

   

Si usted es un usuario de Maven , generalmente el plugin de ensamblaje hace lo que quiere, o potencialmente el plugin de sombra, y en algunos casos una combinación.

Con el complemento de ensamblaje, coloca un archivo de manifiesto en su proyecto con la configuración necesaria, aunque los valores predeterminados suelen ser bastante buenos. La construcción se hace con

 mvn assembly:assembly 

O si tiene más cosas especiales con las que lidiar, uno de los otros objectives. Todos los archivos JAR que se incluyen son recogidos por el resolutor de dependencias de Maven. Si usa el plugin de sombreado, generalmente es parte del objective de instalación, y en un proyecto en particular que estoy haciendo ahora lo hago

 mvn install mvn assembly:single 

El assembly:single objective assembly:single es solucionar los problemas de duración, en este caso en una aplicación de Spring .

Puede usar JarJar que utilizará sombreado de paquetes para asegurarse de que su archivo JAR no entre en conflicto con otros.

Hay ProGuard que no solo empaqueta sus archivos JAR en uno, sino que también puede optimizar, limpiar u ofuscar sus archivos de clase, haciendo que el archivo JAR resultante sea mucho más pequeño que la sum de todos los archivos JAR anteriores.

De hecho, probé ProGuard con la herramienta JRST, y es como informaste. Intenté rastrear el problema y descubrí que se relaciona con un error en la biblioteca de ICU4J al que hace referencia el primero. El problema es que la versión de la UCI utilizada está muy desactualizada en este momento. Así que reemplacé el archivo icu.jar con ICU4J versión 3.2. Ahora ProGuard encuentra un montón de otros errores / advertencias sobre incidencias con las bibliotecas de JRST.

Mi suposición es que ProGuard funciona como se esperaba, pero las bibliotecas de jrst simplemente no son consistentes. No sé si puede hacer mucho más que hablar con sus desarrolladores, ya que deberían verificar y actualizar las dependencias del proyecto.

(basado en Andrian’s):

          

One-JAR 0.97 acaba de ser lanzado en http://one-jar.sourceforge.net , y se ha ampliado con soporte para frameworks como Spring y Guice , que pueden presentar problemas para otros enfoques. También maneja la inversión de cargador de clases, donde algunos archivos JAR son externos al One-JAR (por ejemplo, controladores JDBC que pueden no estar empaquetados).

One-JAR es línea de comandos, con plugins Ant y Maven 2. También es fácil de construir simplemente usando la herramienta “jar”.

También puedo recomendar el Eclipse Jar Exporter (Runnable) en el que Ference Hechler escribió: hizo un gran trabajo al idear un enfoque simple para envolver un conjunto de archivos JAR. Él y yo trabajamos en One-JAR, pero Jar Exporter se basa en una base de códigos diferente.

Hay una herramienta llamada autojar que escaneará su bytecode y comstackrá un archivo .jar con las clases que encuentre, incluidas las clases referenciadas (importadas).

Sin embargo, no siempre funciona con algo como Spring, donde especificas los nombres de clases en la configuración y el marco los carga.

O utilizando el complemento Maven assembly (mvn assembly: assembly)

Creo que la herramienta que necesitas aquí es JarSplice : http://ninjacave.com/jarsplice

No requiere Ant o Maven, tiene su propia GUI, es fácil de usar y hace exactamente lo que usted pidió -> Fusiona el contenido de varios archivos jar en uno solo (tenga en cuenta que aún necesita agregar su propio cargador de clases) )

Deberías usar el plugin maven shading para hacer eso. A menudo uso maven para construir un archivo jar independiente y es tan poderoso

Ver más:

http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

Parece que Apache Ant es lo que estás buscando.