2010-05-26 16 views
33

De mis lecturas, cuando se ejecuta un comando de la siguiente manera:incluyen frasco externa cuando se ejecuta java-jar

java -jar foo.jar 

A continuación, se ignora la ruta de clase principal, y la ruta de clase se toma del archivo de manifiesto.

Además, el classpath declarado en la línea de comando también se ignora. Por lo tanto, en:

java -classpath /usr/local/jar/foobar.jar -jar foo.jar 

/usr/local/jar/foobar.jar se ignora.

Por último, he leído que el archivo de manifiesto solo puede contener rutas de acceso relativas dentro del archivo jar.

Entonces, ¿cómo se incluyen las rutas absolutas a los archivos jar externos, que están presentes en el sistema, pero no en el archivo jar que se está ejecutando?

+3

"Nota: El encabezado Class-Path apunta a clases o archivos JAR en la red local, ** no archivos JAR dentro del archivo JAR o clases accesibles a través de protocolos de Internet **. Para cargar clases en archivos JAR dentro de un archivo JAR en la ruta de clase, debe escribir código personalizado para cargar esas clases. Por ejemplo, si MyJar.jar contiene otro archivo JAR llamado MyUtils.jar, no puede usar el encabezado Class-Path en el manifiesto de MyJar.jar para cargar clases en MyUtils. jar en el camino de la clase ". Fuente: https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html –

Respuesta

37

¿Hay una razón por la que está evitando invocar la clase principal como

java -cp /usr/local/jar/foobar.jar:/some/other/path.jar com.your.main.classname 

?

Este tipo de invocación le permite mezclar rutas absolutas con rutas relativas. Coloque esto en un script de shell o en un archivo por lotes para evitar tener que escribir o recordar el classpath completo para simplificar las cosas.

+1

+1 para este consejo práctico! Oracle/SUN realmente debería desaprobar la opción -jar ... es una pesadilla recurrente ... –

+4

Bueno, usar '-jar' puede ser significativamente más fácil en algunos escenarios, pero si encuentras que la opción simplificada te está dando problemas, entonces siempre tiene sentido recurrir a la opción que le da control total –

34

Puede crear una carpeta, por ejemplo, lib, dentro de la carpeta donde tiene el archivo jar.

contenidos manifest.mf pueden ser:

Main-Class: com.mastergaurav.test.app.MainClass 
Class-Path: lib/one.jar lib/two.jar 

contenido de la carpeta:

mainFolder/ 
    * lib/one.jar 
    * lib/two.jar 
    * my-main.jar 

ejecutar:

+2

Por cierto, si ejecuta java -cp/addtional/class/path -jar abcd.jar, la classpath adicional no será ignorado –

+3

No tiene ni idea de cuánto tiempo he buscado esto. Gracias. – Bogdan

+0

Excelente explicación! Y, por cierto, no se admite wildcard, qué triste ... –

Cuestiones relacionadas