java execute jar with libraries
Ejecute un archivo JAR desde la lĂnea de comando y especifique classpath (4)
Alternativamente, use el manifiesto para especificar el class-path y main-class si lo desea, de modo que no necesita usar -cp
o especificar la clase principal. En su caso, contendría líneas como esta:
Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar
Desafortunadamente, necesita deletrear cada jar en el manifiesto (no es tan grave como solo lo hace una vez, y puede usar un script para compilar el archivo o usar una herramienta de compilación como ANT o Maven o Gradle). Y la referencia tiene que ser un directorio relativo o absoluto donde ejecuta java -jar MyJar.jar
.
Luego ejecútelo con
java -jar MyJar.jar
He compilado un archivo JAR y he especificado la clase principal en el manifiesto (utilicé la función de exportación de Eclipse). Mis dependencias están todas en un directorio llamado lib
. Parece que no puedo obtener una respuesta directa sobre cómo ejecutar mi archivo JAR mientras especifico que debería usar lib/*
como ruta de clase.
He intentado:
]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main
etc ...
Cada uno da un error que dice:
Error: Could not find or load main class ....
o da el NoClassDefFoundError
indica que las bibliotecas no se encuentran.
Incluso probé a rehacer el archivo JAR e lib
directorio y contenido de lib
, pero aún no había dado ...
¿Cómo puedo ejecutar un archivo JAR desde la línea de comando y especificar el classpath que debo usar?
Cuando especifica -jar
entonces el parámetro -cp
será ignorado.
De la documentación :
Cuando utiliza esta opción, el archivo JAR es el origen de todas las clases de usuario y se ignoran otras configuraciones de ruta de clase de usuario.
Tampoco puede "incluir" archivos jar necesarios en otro archivo jar (deberá extraer sus contenidos y colocar los archivos .class en su archivo jar)
Tienes dos opciones:
- incluir todos los archivos jar del directorio
lib
en el manifiesto (puede usar rutas relativas allí) - Especifique todo ( incluido su jar) en la línea de comandos usando
-cp
:
java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
Ejecute un archivo jar y especifique una ruta de clases como esta:
java -cp <jar_name.jar:libs/*> com.test.App
jar_name.jar
es el nombre completo del JAR que quieres ejecutar
libs/*
es una ruta a sus JAR de dependencia
com.test.App
es el nombre completo de la clase del JAR que tiene el método main(String[])
El jar y el jar dependiente deberían tener permisos de ejecución.
Puedes hacer esto en shell de Unix:
java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
Puede hacer esto en Windows PowerShell:
java -cp "MyJar.jar;lib/*" com.somepackage.subpackage.Main