2009-06-08 19 views
5

Desidero eseguire un archivio jar eseguibile dall'applicazione Java in esecuzione. Devo essere in grado di controllare le classi in esecuzione dall'interno della mia applicazione (ad es. Stop, avviarle ecc.).Esecuzione di un archivio jar in un'applicazione Java in esecuzione

Fondamentalmente ho bisogno di fare l'eqvilient di "java -jar X.jar".

Non riesco a utilizzare Runtime.getRuntime(). Exec ("...") poiché i file jar verranno codificati e devono essere prima decodificati.

risposta

4

Un 'Executable Jar' è un semplice file jar in cui il manifest ha una proprietà speciale che definisce 'la' classe principale.

Quindi è sufficiente posizionare il jar eseguibile sul classpath, identificare la classe 'main' e chiamare il metodo statico principale di questa classe.

+1

potrebbe desiderare di utilizzare un costume ClassLoader o URLClassLoader.newInstance per caricare le classi in modo dinamico. –

9

Ecco un esempio di tirare il nome del Main-Class dal file jar utilizzando un JarFile poi caricare la classe dal vaso utilizzando un URLClassLoader e poi invocare static void main utilizzando la riflessione:

package test; 

import java.io.File; 
import java.lang.reflect.Method; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.jar.Attributes; 
import java.util.jar.JarFile; 

public class JarRunner { 

    public static void main(String[] args) throws Exception{ 
     File jar = new File(args[0]); 
     URLClassLoader classLoader = new URLClassLoader(
      new URL[]{jar.toURL()} 
     ); 

     JarFile jarFile = new JarFile(jar); 
     Attributes attribs = jarFile.getManifest().getMainAttributes(); 
     String mainClass = attribs.getValue("Main-Class"); 

     Class<?> clazz = classLoader.loadClass(mainClass); 
     Method main = clazz.getMethod("main", String[].class); 
     main.invoke(null, new Object[]{new String[]{"arg0", "arg1"}}); 
    } 
} 
+2

+1 per la brillante dimostrazione per Classloader, JarFile e reflection. Ma tutti quelli che sono New To Java dovrebbero notare che il target mathod principale è invocato con gli argomenti 'arg0' e 'arg1'. Un'implementazione del mondo reale deve sostituire queste stringhe con argomenti reali. –

+0

Una correzione minore è necessaria se la "classe principale" si trova anche sul percorso di classe: "URLClassLoader classLoader = new URLClassLoader (new URL [] {jar.toURL(), null});". Ciò impedisce la delega al classloader corrente, che può causare il caricamento delle classi dipendenti nel file JAR. – plinehan

Problemi correlati