2011-12-06 23 views
6

Tengo un archivo jar que menciona la clase principal en el manifiesto. Cuando intento ejecutar el frasco con el siguiente comandoTiene la opción java -jar alterar las opciones de classpath

java -cp .;./* com.foo.MainClass 

El código se ejecuta y funciona.

Cuando intento ejecutar el frasco con el siguiente comando

java -cp .;./* -jar myjar.jar 

consigo clase no execptions encontrados para algunas jarras que están en la misma carpeta que myjar.jar. Espero que la opción -cp incluya esos archivos jar en la ruta de la clase. Modifiqué mi código para imprimir la propiedad java.class.path. En el primer caso, se enumeraban todos los archivos jar en el directorio actual, en el segundo caso solo se enumeraba myjar.jar

También modifiqué el manifiesto para agregarle un elemento Class-Path con todos los archivos jar. Entonces el segundo comando funciona. Pero en mi código estoy tratando de cargar una clase aribtrary cuyo nombre se proporciona en el símbolo del sistema, por lo que quiero que la ruta de clase contenga todos los archivos jar en una carpeta. ¿Cómo hago que el segundo comando funcione en este escenario?

+0

Eche un vistazo a [OneJar] (http://one-jar.sourceforge.net/). Eso debería resolver sus problemas de CP. – flash

+0

@flash: Probablemente no. Él dice que no conoce la ruta de clase adicional en tiempo de compilación (de lo contrario, podría simplemente agregarlo al manifiesto). – Thilo

+1

Parece que tiene que usar su propio cargador de clases (que agrega cosas de acuerdo con su entorno). – Thilo

Respuesta

6

De this,

Un JAR ejecutable debe hacer referencia a todos los demás archivos JAR dependientes se requiere a través de la cabecera de ruta de clase del archivo de manifiesto. La JVM ignora la variable de entorno CLASSPATH y cualquier ruta de clase especificada en la línea de comando si se utiliza la opción -jar.

+0

Gracias! ¿Esto significa que si quiero cargar una clase aribtrary cuyo archivo jar está presente en el mismo lugar que mi archivo jar (y no se menciona en mi manifiesto), necesito usar URLClassLoader para cargar ese contenedor explícitamente? – mihirg

+0

Bueno, podrías agregar algo como 'plugins/*' a tu classpath de manifiesto. La carpeta para los archivos jar se solucionará, pero todos los archivos que contengan deberían ser recogidos. – Thilo

+0

O tal vez no: "Sin embargo, los comodines de la ruta de clase no se respetan en el encabezado jar-manifestación Class-Path." :-( – Thilo

0

Here es una buena discusión sobre este tema.

Cuestiones relacionadas