実行中のJavaアプリケーション内から実行可能なjarアーカイブを実行します。 実行中のクラスをアプリケーション内から制御できる必要があります(つまり、停止、開始など)。実行中のJavaアプリケーションでjarアーカイブを実行する
基本的に私は "java -jar X.jar"の平準化を行う必要があります。
jarファイルがエンコードされ、最初にデコードする必要があるため、Runtime.getRuntime()。exec( "...")を使用することはできません。
実行中のJavaアプリケーション内から実行可能なjarアーカイブを実行します。 実行中のクラスをアプリケーション内から制御できる必要があります(つまり、停止、開始など)。実行中のJavaアプリケーションでjarアーカイブを実行する
基本的に私は "java -jar X.jar"の平準化を行う必要があります。
jarファイルがエンコードされ、最初にデコードする必要があるため、Runtime.getRuntime()。exec( "...")を使用することはできません。
「実行可能なJAR」は、マニフェストに 'the'メインクラスを定義する特別なプロパティがある単純なjarファイルです。
クラスパス上に実行可能なjarを配置し、 'main'クラスを識別し、このクラスの静的メインメソッドを呼び出すことができます。
ここ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"}});
}
}
+1 Classloader、JarFileとリフレクションの素晴らしいデモンストレーションです。しかし、New to Javaの皆さんは、ターゲットの主要なmathodは引数 'arg0'と 'arg1'で呼び出されることに注意する必要があります。実世界の実装では、これらの文字列を実際の引数で置き換える必要があります。 –
"メインクラス"がクラスパス上にある場合は、 "URLClassLoader classLoader = new URLClassLoader(new URL [] {jar.toURL()、null});"という微妙な修正が必要です。これにより、現在のクラスローダーへの委任が防止され、JARファイル内の依存クラスが読み込まれなくなる可能性があります。 – plinehan
は、カスタムを使用する場合がありますClassLoaderまたはURLClassLoader.newInstanceを使用してクラスを動的にロードします。 –