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

Tengo un proyecto Maven que genera un archivo jar y copia todas las dependencias a target/lib carpeta target/lib . Quiero ejecutar este proyecto en la máquina del cliente (Windows). Entonces, copié myproject.jar a la myproject.jar C:\xyz y todas las dependencias a la carpeta C:\xyz\lib . ¿Cómo ejecuto este proyecto desde el símbolo del sistema del cliente? Intenté usar java -cp lib\*.jar -jar myproject.jar de la java -cp lib\*.jar -jar myproject.jar C:\xyz 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 eliminará el problema, pero no quiero hacer esto, ya que tengo 40 bibliotecas y podría crecer en lanzamientos futuros. ¿Hay una mejor manera de hacer esto?

Deje que maven genere un archivo por lotes para comenzar su aplicación. Esta es la forma más simple de esto.

Puede usar el appassembler-maven-plugin para tales fines.

No puede usar tanto -jar como -cp en la línea de comando – vea la documentación de java que dice que si usa -jar :

el archivo JAR es la fuente de todas las clases de usuario y se ignoran otras configuraciones de ruta de clase de usuario.

Podrías hacer algo como esto:

java -cp lib\*.jar;. myproject.MainClass

Observe el ;. en el argumento -cp , para evitar un error de la línea de comandos de Java. Además, tenga en cuenta que esta es la versión de Windows del comando. El separador de ruta en Unix es :

Usando java 1.7, en UNIX –

 java -cp myjar.jar:lib/*:. mypackage.MyClass 

En Windows necesitas usar ‘;’ en lugar de ‘:’ –

 java -cp myjar.jar;lib/*;. mypackage.MyClass 

una posible solución podría ser

crea un archivo por lotes

hay un bucle en el directorio lib para todos los archivos dentro de él y establece cada archivo unside lib en classpath

luego de eso corre el flask

fuente para el bucle en el archivo por lotes para obtener información sobre los bucles

Puede usar maven-assembly-plugin, aquí está el ejemplo del sitio oficial: https://maven.apache.org/plugins/maven-assembly-plugin/usage.html

   org.apache.maven.plugins maven-assembly-plugin 2.5.1   jar-with-dependencies    your main class      make-assembly  package   single     

Hay varias opciones.

El más fácil es probablemente el complemento ejecutivo .

También puede generar un jar que contenga todas las dependencias usando el plugin de ensamblaje .

Por último, puede generar un archivo con el classpath en él usando el objective de dependency:classpath .

Me encontré con el mismo problema, pero pude empaquetar todas las dependencias en mi archivo jar utilizando el plugin Maven Shade

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

Entonces en 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 sus flasks en el directorio ext de su JRE. Esto está bien si estás usando un JRE independiente. Si está utilizando el mismo JRE para ejecutar más de una aplicación , no recomiendo hacerlo.