2010-12-12 8 views

答えて

6

一般的には不可能です。

@ khachikの回答で提供されるレシピは、Sun以外のJava実装では必ずしも機能しません。

  • Java実行可能ファイルは、必ずしもjava呼び出されず、必ずしもbinサブディレクトリに住んでいません。 Sun Javaの場合でも、Windows上には2つの実行可能ファイルがあります。 javaおよびjavaw

  • JVMを起動するコマンドのコマンドオプションは、Java実装によって異なります。従って、ProcessBuilderのステップには移植性のない引数が含まれている可能性があります。


ほとんどのJVMは、主日javaコマンドオプションを採用しているが、多数の違いがあります。たとえば:

  • IBM J9は、実行可能名としてj9j9wを使用しています。
  • BEA/Oracle JRockitは異なる-X-XXオプションを持っています。
  • Jikes RVMrvmを実行可能ファイル名として使用し、サブセットのSunのjavaオプションのみをサポートします。
  • IKVMは、実行可能ファイル名としてikvmを使用します。

(注:これらは、それぞれのオンラインドキュメントの一遍読みに目立つあくまで一例である。)

+0

最初の申し立てをサポートするためのリンクはありますか? –

10

現在のJVMを見つけるためにjava.homeシステムプロパティを使用することができます。

String jvm = new java.io.File(new java.io.File(System.getProperty("java.home"), 
               "bin"), 
           "java").getAbsolutePath(); 

をし、その後ProcessBuilder(またはRuntime.exec)を使用して、それを実行します。

JDKの場合、java.homeは、JDKに含まれるJREディレクトリを指します。

1

は、あなたは、Apache CommonsのLIBSを使用してみましたか?あなたはlauncher projectを試してみてください。私はしばらく前から私にとってとても役に立ちました。ランチャーコンポーネントは、クロスプラットフォームのJavaアプリケーション起動できるように設計されて

はここで自分のサイトからプロジェクトの説明です。

オリジナルのJavaクラスは、Tomcat 4.0プロジェクトから提供されています。

コモンズランチャーは、Javaクラスを起動するためのバッチまたはシェルスクリプトの必要性を排除します。バッチスクリプトやシェルスクリプトを削除することが望ましい状況は、次のとおりです。

  • 特定のアプリケーションパスがどこにあるかを判断する必要はありません。あなたのアプリケーションのホームディレクトリなど。Windowsのバッチスクリプトでこれを動的に判断することは、Windowsのいくつかのバージョンや、Unixプラットフォームでソフトリンクが使用されている場合、非常に難しいです。
  • ネイティブのファイルとパスの区切り文字やネイティブパスの引用符の問題を処理する必要がないようにする必要があります。
  • 特定のシステムプロパティを適用する必要があります。 JDK 1.4で動作している場合はjava.endorsed.dirs。
  • スクリプト内の引数を解析して順序を変更することなく、ユーザーがカスタムJVM引数またはシステムプロパティを渡すことを許可します。これは、バッチスクリプトやシェルスクリプトでは、やりにくく、乱雑になります。 バッチファイルとシェルスクリプトでシステムプロパティをハードコードする代わりに、システムプロパティを設定ファイルからブートストラップする必要があります。
  • ローカライズされたエラーメッセージを提供したいのですが、これはバッチスクリプトとシェルスクリプトで非常に扱いにくいものです。
+0

私がそれを理解していれば、実行可能ファイルを知っている外部プロセス以外のJavaプロセスを開始することはできません。しかしこれが問題です。私は現在の実行可能ファイルを知らない。 – Horcrux7

関連する問題