Ejecute un archivo JAR desde la línea de comando y especifique classpath

He comstackdo 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:

  1. incluir todos los archivos jar del directorio lib en el manifiesto (puede usar rutas relativas allí)
  2. 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  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 

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 comstackr el archivo o usar una herramienta de comstackció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 
    Intereting Posts