2009-06-08 15 views
5

Chcę uruchomić działające archiwum jar z poziomu mojej działającej aplikacji Java. Muszę mieć możliwość kontrolowania uruchomionych klas z poziomu mojej aplikacji (np. Zatrzymaj, uruchom je itp.).Uruchamianie archiwum słoików w działającej aplikacji Java

Zasadniczo potrzebuję wykonać równanie "java -jar X.jar".

Nie mogę użyć Runtime.getRuntime(). Exec ("..."), ponieważ pliki JAR zostaną zakodowane i muszą najpierw zostać zdekodowane.

Odpowiedz

4

"Plik wykonywalny" to prosty plik jar, w którym manifest ma specjalną właściwość, która definiuje "główną" klasę.

Po prostu umieść plik wykonywalny w ścieżce klas, określ klasę główną i wywołaj statyczną metodę główną tej klasy.

+1

chcieć użyć niestandardowego ClassLoader lub URLClassLoader.newInstance w celu dynamicznego ładowania klas. –

9

Oto przykład ciągnąc nazwę Main-Class z pliku jar przy użyciu JarFile następnie ładuje klasę ze słoika przy użyciu URLClassLoader a następnie powołując static void main użyciu odbicia:

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 za genialną demonstrację Classloader, JarFile i refleksji. Ale każdy, kto jest nowością w Javie, powinien zauważyć, że cele główne są wywoływane argumentami "arg0" i "arg1". Realizacja realnego świata musi zastąpić te łańcuchy prawdziwymi argumentami. –

+0

Drobna poprawka jest wymagana, jeśli "główna klasa" również znajduje się w ścieżce klasy: "URLClassLoader classLoader = new URLClassLoader (nowy adres URL [] {jar.toURL(), null});". Zapobiega to delegowaniu do bieżącego programu ładującego klasy, co może spowodować niepowodzenie ładowania klas zależnych w pliku JAR. – plinehan

Powiązane problemy