2009-06-08 21 views
5

実行中のJavaアプリケーション内から実行可能なjarアーカイブを実行します。 実行中のクラスをアプリケーション内から制御できる必要があります(つまり、停止、開始など)。実行中のJavaアプリケーションでjarアーカイブを実行する

基本的に私は "java -jar X.jar"の平準化を行う必要があります。

jarファイルがエンコードされ、最初にデコードする必要があるため、Runtime.getRuntime()。exec( "...")を使用することはできません。

答えて

4

「実行可能なJAR」は、マニフェストに 'the'メインクラスを定義する特別なプロパティがある単純なjarファイルです。

クラスパス上に実行可能なjarを配置し、 'main'クラスを識別し、このクラスの静的メインメソッドを呼び出すことができます。

+1

は、カスタムを使用する場合がありますClassLoaderまたはURLClassLoader.newInstanceを使用してクラスを動的にロードします。 –

9

ここURLClassLoaderを使用してjarファイルからクラスをロードし、その後、リフレクションを使用してstatic void mainを起動し、その後JarFileを使用してjarファイルからMain-Classの名前を引っ張っての例です:

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 Classloader、JarFileとリフレクションの素晴らしいデモンストレーションです。しかし、New to Javaの皆さんは、ターゲットの主要なmathodは引数 'arg0'と 'arg1'で呼び出されることに注意する必要があります。実世界の実装では、これらの文字列を実際の引数で置き換える必要があります。 –

+0

"メインクラス"がクラスパス上にある場合は、 "URLClassLoader classLoader = new URLClassLoader(new URL [] {jar.toURL()、null});"という微妙な修正が必要です。これにより、現在のクラスローダーへの委任が防止され、JARファイル内の依存クラスが読み込まれなくなる可能性があります。 – plinehan

関連する問題