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 mainmétodo desde un archivo JAR, incluso si el archivo jar tiene unMain-Classdefinido .Ejecutar clase principal:
Ejecute otra clase con un
public static void mainmétodo:Nota: los primeros usos
-jar, los segundos usos-cp.fuente
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethodNote 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-bootproyecto 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.PropertiesLauncherclase Spring-boot sirve como una clase de entrada de despacho, y el-Dloader.mainparámetro le dice qué ejecutar.Referencia: https://github.com/spring-projects/spring-boot/issues/20404
fuente
En primer lugar,
jarcrea un jar y no lo ejecuta. Intenta en sujava -jarlugar.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 -jarrequiere que se especifique una clase principal. Podrías intentarlo en sujava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...lugar.-cpestablece 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.jarfuente
Agregue el complemento a continuación en su archivo pom.xml y especifique la Clase principal con el nombre completo en el elemento.
fuente