2010-11-30 12 views
5

私はデスクトップアプリケーションを持っています。誰かがボタンを押すと、クラスのmainメソッドを実行する別のJVMを起動します。私のデスクトップアプリケーションは、すでに実行したいmainメソッドを持つクラスを含むjarファイルに依存しています。 別のJVMのJavaデスクトップアプリケーション内からJava mainメソッドを実行

は現在、私は、しかし、私は彼らがこれを行うにはよりエレガントな方法だった期待していた、次のコードを持っている:

Runtime runtime = Runtime.getRuntime(); 
Process process = runtime.exec("java -jar another.jar"); 

私はあまりにもProcessBuilderをを使用することができます知っています。

することは、(擬似コードを言い訳)などの方法がありません:

Jvm.execute(Main.class); 

私はすでに呼びたいのメインクラスは、私のクラスパスに存在するので、それだけでjavaコマンドを実行する必要が変な感じランタイム経由。

+1

コードからメインメソッドを実行することはできませんか? – Rogach

+1

新しいバックグラウンドスレッドを開始できますか?その場合、ユーザーにタスク仕上げを報告することもできます。 –

+0

別のjvmが私の望むものです。 – digiarnie

答えて

1

非常に良い質問です。管理APIを検索してみてください:http://cupi2.uniandes.edu.co/javadoc/j2se/1.5.0/docs/api/javax/management/package-frame.html

幸いです。

私はこのAPIが存在するかどうかは確信していませんが、それがあればそれが存在するはずです。 私は個人的にProcessBuilderを使用しましたが、現在のプロセスのシステムプロパティを取得することで明示的なjavaへのパスを指定しました。

0

HSQLDBには、複数の異なるプロセスのmainメソッドを呼び出す汎用ソリューションがあります。このクラスを使用して任意のプロセスを呼び出すMainInvoker class source

2

このMainクラスを別のJVMで実行する必要があるのはなぜですか?それは物事を複雑にするだけです。

通常ちょうどMain.main(argsが)しかし、OKになります。

あなただけの別のクラスローダの下でそれを実行して、あなたのプログラムからそのプログラムを隔離したい場合は - のURLClassLoaderのマニュアルを参照してください。複雑なJavaアプリケーションサーバーでも、多くのプロセス(通常は1つのJVMプロセス)を作成せず、デプロイされたWARとEARをクラスローダーだけで分離することに注意してください。クラスローダーは、JVMのプロセスと同じだと考えるかもしれません。

「安全でない」操作を実行する別のプログラムでは、java.securityのJavaセキュリティー・メカニズムを使用して、そのプログラムがそれらの操作を行わないようにします。

この別のプログラムがSystem.exit()を呼び出してプログラムを停止した場合、セキュリティ機構を使用して、そのプログラムがSystem.exit()を呼び出すことを禁止します。System.exit()Javadocを参照してください。その後、SecurityExceptionをキャッチして無視することができます。

関連する問題