2

有効なユーザー名とパスワードを指定すると、JAR ファイルがまだ存在しない場合、または更新が利用可能な場合に、Web サイトから JAR ファイルをダウンロードするゲームのランチャーを作成しました。ログイン システムとファイルのダウンロードは機能しますが、ダウンロードした JAR ファイルを実行するにはどうすればよいですか?

試してみRuntime.getRuntime().exec("java -jar " + file.getAbsolutePath());ましたが、役に立ちませんでした。

助けてくれてありがとう!


downloading = new JLabel("Download AudioRPG executable from server. This may take up to a minute.");
                            downloading.setHorizontalAlignment(SwingConstants.CENTER);

                            Thread th = new Thread(new Runnable() {
                                public void run() {
                                    remove(username);
                                    remove(password);
                                    remove(submit);
                                    remove(remember);
                                    add(downloading, BorderLayout.CENTER);
                                    pack();

                                    try {
                                        FTPClient client = new FTPClient();

                                        client.connect("audiorpg.net");
                                        client.login("audiorpg", "mcpogotime1");
                                        client.changeDirectory("files");
                                        client.download("AudioRPG.jar", exe);
                                        client.disconnect(true);
                                        downloading.setText("Done! Launching AudioRPG...");
                                    }
                                    catch (Exception e) { e.printStackTrace(); }
                                }
                            });

                            th.start();

                            startExternalJAR(getClass(), th, exe);

private static void startExternalJAR(Class<?> c, Thread th, File exe) {
        if (!th.isAlive()) {
            try {
                final String mainClass;
                final JarFile jarFile = new JarFile(exe);
                try {
                    final Manifest manifest = jarFile.getManifest();
                    mainClass = manifest.getMainAttributes().getValue("Main-Class");
                } finally {
                    jarFile.close();
                }
                final URLClassLoader child = new URLClassLoader(new URL[]{exe.toURI().toURL()}, c.getClassLoader());
                final Class<?> classToLoad = Class.forName(mainClass, true, child);
                final Method method = classToLoad.getDeclaredMethod("main", String[].class);
                final Object[] arguments = {new String[0]};
                method.invoke(null, arguments);
            }
            catch (Exception ex) { ex.printStackTrace(); }
        }
        else {
            try { Thread.sleep(1000); }
            catch (Exception e) { }
            startExternalJAR(c, th, exe);
        }
    }

それは私が今使用しようとしているコードですが、機能していません。@Boris the Spiderのヒントはありますか?

4

2 に答える 2

4

コマンドのように jar を実行しないでください。クラスローダーを使用してjarから必要なクラスをロードし、インスタンス化します。

http://docs.oracle.com/javase/tutorial/deployment/jar/jarclassloader.html

  1. を作成して jar をロードしnew JarClassLoader("url goes here")ます。
  2. .invokeClass("MyMainClassName", new String[] { "Args", "Go", "Here" })JarClassLoader を呼び出します。
于 2013-04-26T22:09:04.330 に答える
0

を使用してURLClassLoaderをロードしてjarから を呼び出す必要がありますmain

final String mainClass;
final JarFile jarFile = new JarFile(file);
try {
    final Manifest manifest = jarFile.getManifest();
    mainClass = manifest.getMainAttributes().getValue("Main-Class");
} finally {
    jarFile.close();
}
final URLClassLoader child = new URLClassLoader(new URL[]{file.toURI().toURL()}, this.getClass().getClassLoader());
final Class classToLoad = Class.forName(mainClass, true, child);
final Method method = classToLoad.getDeclaredMethod("main", String[].class);
final Object[] arguments = {new String[0]};
method.invoke(null, arguments);

この SO answerから取得。

于 2013-04-26T22:13:25.323 に答える