2010-02-15 22 views
6

¿Es posible crear un archivo JAR que requiera dependencias externas sin incluir esas dependencias en el archivo JAR?Crear archivo JAR sin incluir dependencias externas

Mi google-fu no me ha dado una respuesta; todo lo que he encontrado muestra cómo incluirlos en el archivo JAR, pero no qué poner en el archivo de manifiesto para decir "No los tengo, mire en el classpath del usuario". Supongo que las dependencias están correctamente instaladas y configuradas en el classpath del usuario.

En mi caso, mis dependencias son Apache Commons CLI y Math.


Editar: Dentro de mi archivo JAR, tengo Main.class.

Mi archivo de manifiesto el siguiente aspecto:

Manifest-Version: 1.0 
Created-By: 1.6.0 (Sun Microsystems Inc.) 
Main-Class: Main 

Mi CLASSPATH parece

.;C:\Program Files\Java\jre1.6.0_06\lib\ext\QTJava.zip;C:\java_lib\commons-cli-1.2.jar;C:\java_lib\commons-math-2.0\commons-math-2.0.jar 

Si incluyo las dependencias en el frasco en /lib y añadir la línea Class-Path: lib/commons-math-2.0.jar lib/commons-cli-1.2.jar al manifiesto, a continuación, lo hace trabajo.

He intentado agregar Class-Path: commons-math-2.0.jar commons-cli-1.2.jar al manifiesto sin incluir los archivos en el JAR solo para ver si eso funcionaría, pero no fue así.

Respuesta

3

Utilice la entrada Class-Path en el META-INF/MANIFEST.MF para indicar dónde buscar las dependencias relativas a su JAR. Por ejemplo:

Class-Path: servlet.jar ../foo/bar.jar acme/beans.jar 
+0

pero no sé dónde están, excepto que existen en el classpath de la computadora del usuario. – masher

+0

@masher Agrupe todo en un zip para que tenga el control de la ubicación. De lo contrario, esto no es para ti. Es mejor pedirle al usuario que configure su ruta de clase manualmente en ese caso. –

+0

@ masher: si no sabe dónde están, no debe enumerarlos en absoluto, pero documente que el usuario debe colocarlos en el classpath al lado de su jar. – Fredrik

3

Sin duda es posible. Una forma de pensarlo es que cada vez que creas un jar, dependes de las clases del jre, y no es necesario incluirlas en el jar. La jre los buscará automáticamente en el classpath. Si no se encuentran, verá un NoClassDefFoundError.

+2

+1. Como dice akf, no debería tener que hacer nada, siempre que la ruta de clase del usuario sea correcta. Poner entradas en el manifiesto es solo una forma de agregarlo al classpath. –

+0

Veo que no debería tener que hacer nada, ¡es solo que no puedo hacer que funcione! Oh, bueno, en este caso particular, es solo ~ 130 kB adicionales, entonces puedo vivir con la inclusión de las bibliotecas en el JAR ... – masher

+0

y estás identificando tus dependencias en la línea de comando java en el classpath? – akf

Cuestiones relacionadas