for descargar create abre java jar executable-jar

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 .



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