it-swarm-es.com

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

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

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

Java -jar rst.jar

Por lo que puedo decir, no tiene dependencias, lo que indica que no debería ser una herramienta sencilla 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 tener que 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 la agrupación constante en los archivos JAR.

Aparentemente el primero está ligeramente roto, así que intentaré arreglarlo. El archivo Mavenpom.xml aparentemente también se rompió, así que tendré que arreglarlo antes de arreglarlo primero ... Me siento como un imán de errores :-)


Actualización: nunca logré arreglar esta aplicación, pero verifiqué el "Asistente de exportación de JAR ejecutable" de { Eclipse que se basa en un JAR grueso. Encontré esto muy fácil de usar para implementar mi propio código.

Algunas de las otras sugerencias excelentes podrían ser mejores para compilaciones en un entorno que no sea Eclipse, por lo que oss probablemente debería hacer una compilación agradable usando Ant . (Maven, hasta ahora solo me ha dado dolor, pero a otros les encanta).

70
tovare

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

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

33
Stephen Denne

La zipfileset de la hormiga hace el trabajo

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
</jar>
62
akuhn

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

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

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

Lo realmente genial es que One-JAR manejará la transmisión de argumentos de línea de comandos para usted. El classpath es manejado por el cargador de clases personalizado, asumiendo 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 hormigas; hay una tarea ant personalizada "one-jar" que funciona de la siguiente manera (asumiendo que su manifiesto se llama "rst.mf"):

<target name="jar-rst">
    <one-jar destfile="rst.jar" manifest="rst.mf">
        <main jar="jrst-0.8.1.jar" />
        <lib>
            <fileset dir="${pathToJars}">
                <include name="batik-util-1.6-1.jar" />
                <include name="icu4j-2.6.1.jar" />
                <include name="commons-collections-3.1.jar" />
                <!-- Snip -->
            </fileset>
        </lib>
    </one-jar>
</target>
27
Ashley Mercer

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

Con el complemento de ensamblaje, usted coloca un archivo de manifiesto en su proyecto con las configuraciones necesarias, aunque los valores predeterminados son generalmente bastante buenos. La construcción se realiza con

mvn Assembly:assembly

O si tiene más cosas especiales con las que lidiar, uno de los otros objetivos. Todos los archivos JAR para incluir, son recogidos por el resolvedor de dependencias de Maven. Si usas el complemento de sombra, generalmente es parte del objetivo de instalación, y en un proyecto en particular que estoy haciendo ahora lo hago

mvn install
mvn Assembly:single

El objetivo de Assembly:single es solucionar los problemas de toda la vida, en este caso en una aplicación Spring .

14
larsivi

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

8
Steve g

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 suma de todos los archivos JAR anteriores.

De hecho, probé ProGuard con la herramienta JRST, y es como informaste. Intenté localizar el problema y lo encontré relacionado con un error en la biblioteca ICU4J a la que hace referencia jrst. El problema es que la versión ICU utilizada está obsoleta 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 incosistencias con las bibliotecas de JRST.

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

8
jrudolph

(basado en el de Andrian):

<jar id="files" jarfile="all.jar">
  <zipgroupfileset dir="${library.dir}" includes="*.jar" excludes="test-helper.jar"/>
  <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
  <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
  <fileset dir=".">
    <include name="LICENSE"/>
    <include name="NOTICE"/>
  </fileset>
</jar>
7
象嘉道

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

One-JAR es la línea de comandos, con Ant y Maven 2 plugins. 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 método simple para envolver un conjunto de archivos JAR. Él y yo trabajamos en One-JAR, pero Jar Exporter se basa en un código base diferente.

5
simontuffs

O usando el complemento de ensamblaje de Maven (mvn Assembly: assembly)

3
Philip Helger

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

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

3
user7094

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

Hace no requiere Ant o Maven, tiene su propia GUI, es fácil de usar y hace exactamente lo que pidió ->combina el contenido de varios archivos jar en una sola uno(tenga en cuenta que todavía debe agregar su propio cargador de clases).

2
Nadir

Debes usar el complemento de sombreado de Maven para hacer eso. A menudo utilizo 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

0
hoang