Tengo un JAR con 4 clases, cada una tiene el método Main. Quiero poder ejecutar cada uno de ellos según la necesidad. Estoy tratando de ejecutarlo desde la línea de comandos en el cuadro de Linux.
E.g. The name of my JAR is MyJar.jar
Tiene estructura de directorio para las clases principales de la siguiente manera:
com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class
Sé que puedo especificar una clase como principal en mi archivo de manifiesto. Pero, ¿hay alguna forma en la que pueda especificar algún argumento en la línea de comando para ejecutar la clase que deseo ejecutar?
Intenté esto:
jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt
Y recibí este error:
com/mycomp/myproj/dir2/MainClass2.class : no such file or directory
(En el comando anterior, '/home/myhome/datasource.properties' y '/home/myhome/input.txt' son los argumentos de la línea de comandos).
java
jar
executable-jar
Bhushan
fuente
fuente
Respuestas:
Puede crear su jar sin Main-Class en su archivo de manifiesto. Luego :
fuente
Puede ejecutar cualquier clase que tenga un
public final static main
método desde un archivo JAR, incluso si el archivo jar tiene unMain-Class
definido .Ejecutar clase principal:
Ejecute otra clase con un
public static void main
método:Nota: los primeros usos
-jar
, los segundos usos-cp
.fuente
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
Note las comillas dobles para evitar que./*
las máquinas Unix lo expandan. También tenga en cuenta que"./*.jar"
no funcionará.Además de llamar
java -jar myjar.jar com.mycompany.Myclass
, también puede hacer que la clase principal en su clase Manifiesto sea un Despachador.Ejemplo:
fuente
Esta respuesta es para usuarios de Spring-boot:
Si su JAR era de un
Spring-boot
proyecto y se creó utilizando el comandomvn package spring-boot:repackage
, el método "-cp" anterior no funcionará. Conseguirás:incluso si puedes ver la clase en el JAR por
jar tvf yours.jar
.En este caso, ejecute su clase alternativa con el siguiente comando:
Como entendí, la
org.springframework.boot.loader.PropertiesLauncher
clase Spring-boot sirve como una clase de entrada de despacho, y el-Dloader.main
parámetro le dice qué ejecutar.Referencia: https://github.com/spring-projects/spring-boot/issues/20404
fuente
En primer lugar,
jar
crea un jar y no lo ejecuta. Intenta en sujava -jar
lugar.En segundo lugar, ¿por qué pasa la clase dos veces, como FQCN (
com.mycomp.myproj.dir2.MainClass2
) y como archivo (com/mycomp/myproj/dir2/MainClass2.class
)?Editar:
Parece que
java -jar
requiere que se especifique una clase principal. Podrías intentarlo en sujava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
lugar.-cp
establece el jar en el classpath y permite que Java busque la clase principal allí.fuente
Otra opción similar a la que creo que Nick aludió brevemente en los comentarios es crear múltiples tarros de envoltura. No lo he probado, pero creo que podrían estar completamente vacíos además del archivo de manifiesto, que debería especificar la clase principal para cargar, así como la inclusión de MyJar.jar en el classpath.
MyJar 1 .jar \ META-INF \ MANIFEST.MF
MyJar 2 .jar \ META-INF \ MANIFEST.MF
etc. Entonces solo ejecútalo con
java -jar MyJar2.jar
fuente
Agregue el complemento a continuación en su archivo pom.xml y especifique la Clase principal con el nombre completo en el elemento.
fuente