java - descargar - jar to exe
Cómo ejecutar una clase desde Jar que no es la clase principal en su archivo de manifiesto (7)
Tengo un JAR con 4 clases, cada una tiene un método principal. 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 Manifest. ¿Pero hay alguna manera por la cual puedo especificar algún argumento en la línea de comando para ejecutar cualquier clase que desee 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 obtuve 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).
Además de llamar java -jar myjar.jar com.mycompany.Myclass
, también puede hacer que la clase principal en su Manifiesto sea una clase Dispatcher.
Ejemplo:
public class Dispatcher{
private static final Map<String, Class<?>> ENTRY_POINTS =
new HashMap<String, Class<?>>();
static{
ENTRY_POINTS.put("foo", Foo.class);
ENTRY_POINTS.put("bar", Bar.class);
ENTRY_POINTS.put("baz", Baz.class);
}
public static void main(final String[] args) throws Exception{
if(args.length < 1){
// throw exception, not enough args
}
final Class<?> entryPoint = ENTRY_POINTS.get(args[0]);
if(entryPoint==null){
// throw exception, entry point doesn''t exist
}
final String[] argsCopy =
args.length > 1
? Arrays.copyOfRange(args, 1, args.length)
: new String[0];
entryPoint.getMethod("main", String[].class).invoke(null,
(Object) argsCopy);
}
}
Agregue el complemento siguiente en su archivo pom.xml y especifique la clase principal con el nombre totalmente calificado en el elemento.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.2.5.RELEASE</version>
<configuration>
<mainClass>**main Class name with full qualified name**</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
En primer lugar, jar
crea un jar y no lo ejecuta. Prueba java -jar
en java -jar
lugar.
Segundo, ¿por qué pasas 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 una clase principal para ser especificada. Puede intentar java -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
lugar. -cp
establece el jar en el classpath y permite a java buscar allí la clase principal.
Otra opción similar que creo que Nick aludió brevemente en los comentarios es crear varios contenedores de contenedor. No lo he probado, pero creo que podrían estar completamente vacíos, aparte del archivo de manifiesto, que debería especificar la clase principal a cargar, así como la inclusión de MyJar.jar en la ruta de clase.
MyJar 1 .jar / META-INF / MANIFEST.MF
Manifest-Version: 1.0
Main-Class: com.mycomp.myproj.dir1.MainClass1
Class-Path: MyJar.jar
MyJar 2 .jar / META-INF / MANIFEST.MF
Manifest-Version: 1.0
Main-Class: com.mycomp.myproj.dir2.MainClass2
Class-Path: MyJar.jar
etc. Entonces solo java -jar MyJar2.jar
con java -jar MyJar2.jar
Puede ejecutar cualquier clase que tenga un método public final static main
partir de un archivo JAR, incluso si el archivo jar tiene una Main-Class
definida .
Ejecutar clase principal:
java -jar MyJar.jar // will execute the Main-Class
Ejecuta otra clase con un método public static void main
:
java -cp MyJar.jar com.mycomp.myproj.AnotherClassWithMainMethod
Nota: el primero usa -jar
, el segundo usa -cp
.
Puede lograrlo ejecutando el comando java (no jar) con parámetros. La información sobre las opciones disponibles se puede encontrar aquí: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
Tu puedes crear tu jar sin Main-Class en su archivo Manifest. Entonces :
java -cp MyJar.jar com.mycomp.myproj.dir2.MainClass2 /home/myhome/datasource.properties /home/myhome/input.txt