2009-06-08 1 views
5

실행중인 Java 응용 프로그램 내에서 실행 가능한 jar 아카이브를 실행하려고합니다. 내 애플리케이션에서 실행중인 클래스를 제어 할 수 있어야합니다 (예 : 중지, 시작 등).실행중인 Java 응용 프로그램에서 jar 아카이브 실행

기본적으로 "java -jar X.jar"의 평형을 수행해야합니다.

jar 파일을 인코딩 할 때 Runtime.getRuntime(). exec ("...")을 사용할 수 없으므로 먼저 디코딩해야합니다.

답변

4

'실행 파일 Jar'는 매니페스트가 'the'메인 클래스를 정의하는 특별한 속성을 가지고있는 간단한 jar 파일입니다.

클래스 패스에 실행 파일을 놓고 'main'클래스를 식별하고이 클래스의 정적 main 메소드를 호출하면됩니다.

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"}}); 
    } 
} 
+1

하는 사용자 지정을 사용할 수 있습니다 : 여기 –

9

JarFile은 다음 URLClassLoader를 사용하여 항아리에서 클래스를로드 한 후 반사를 사용하여 static void main를 호출하여 jar 파일에서 Main-Class의 이름을 당기의 예 클래스를 동적으로로드하려면 ClassLoader 또는 URLClassLoader.newInstance를 사용하십시오.
+2

+1은 Classloader, JarFile 및 리플렉션을위한 훌륭한 데모입니다. 그러나 New to Java 인 모든 사람들은 target main mathod가 인수 'arg0'과 'arg1'로 호출된다는 것을 알아야합니다. 실제 구현에서는 이러한 문자열을 실제 인수로 대체해야합니다. –

+0

클래스 경로에 "주 클래스"가있는 경우에는 "URLClassLoader classLoader = new URLClassLoader (새 URL [] {jar.toURL(), null});"라는 사소한 수정이 필요합니다. 이렇게하면 현재 클래스 로더에 대한 위임을 방지 할 수 있으므로 JAR 파일의 종속 클래스가로드되지 않을 수 있습니다. – plinehan