with java maven jar classpath

java execute jar with libraries



Ejecute el archivo jar con mĂșltiples bibliotecas classpath desde el sĂ­mbolo del sistema (8)

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.

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?


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 frascos 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.


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 objetivo de dependency:classpath .


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


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 :


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

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.1</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>your main class</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>


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 frasco

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