Ejecutar archivo jar con múltiples bibliotecas classpath desde símbolo del sistema

Tengo un proyecto Maven que genera un fichero jar y copia todas las dependencias en la carpeta target/lib. Quiero ejecutar este proyecto en la máquina del cliente (windows). Por lo tanto, he copiado myproject.jar a la carpeta C:\xyz y todas las dependencias a la carpeta C:\xyz\lib. ¿Cómo puedo ejecutar este proyecto desde el símbolo del sistema del cliente? He intentado utilizar java -cp lib\*.jar -jar myproject.jar de C:\xyz carpeta, pero arroja el siguiente error.

Exception in thread "main" java.lang.NoClassDefFoundError: lib\commons-codec-1/3/jar
Caused by: java.lang.ClassNotFoundException: lib\commons-codec-1.3.jar
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: lib\commons-codec-1.3.jar.  Program will exit.

Creo que si especifico todas las dependencias en classpath (como java -cp lib\dep1.jar;dep2.jar), se librará del problema, pero no quiero hacer esto porque ya tengo 40 librerías y podría crecer en futuras versiones. ¿Hay alguna forma mejor de hacerlo?

una posible solución podría ser

crear un archivo por lotes

allí hacer un bucle en el directorio lib para todos los archivos dentro de ella y establecer cada archivo fuera de lib en classpath

a continuación, después de que ejecute el tarro

fuente for loop in batch file para información sobre bucles

Comentarios (0)

Hay varias opciones.

La más sencilla es probablemente el exec plugin.

También puedes generar un jar que contenga todas las dependencias utilizando el assembly plugin.

Por último, puedes generar un archivo con el classpath usando el objetivo dependency:classpath.

Comentarios (2)

Esto no funcionará java -cp lib\*.jar -jar myproject.jar. Tienes que ponerlo jar por jar.

Así que en el caso de commons-codec-1.3.jar.

java -cp lib/commons-codec-1.3.jar;lib/next_jar.jar y así sucesivamente.

La otra solución podría ser poner todos tus jars en el directorio ext de tu JRE. Esto está bien si está utilizando un JRE independiente. Si estás usando la misma JRE para ejecutar más de una aplicación yo no recomiendo hacerlo.

Comentarios (7)