41

Javaプログラムの起動に使用するコマンドをコードから取得できるかどうか知りたいのですが。

たとえば、次のコマンドを使用してJavaプログラムを起動した場合:

 java -cp lib1:lib2:... -jar mylib.jar com.foo.Bar

正確な文字列(jvmパラメーターが含まれています)を取得したいと思います。

出来ますか?


賞金と質問にコメントする

ご回答ありがとうございます。残念ながら、私は最初に探していた答えを得ることができませんでした。プログラム自体(クラスパスなどを含む)内から完全なJavaコマンドを取得するための移植可能なソリューションがあることを望んでいました。ポータブルな解決策はないようです。Linuxを使用しているので、agodinhostLuigiR.Viggianoの応答を使用して問題を解決しています。しかし、私は最も完全な(ポータブルな)応答のためにrahulrocに報奨金を与えます。残りの部分については、すべての賛成票:)

4

5 に答える 5

25

以下のコードは、すべての JVM パラメータ、メイン メソッドに渡される引数、およびメイン クラス名を表示する必要があります。

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;

import java.util.List;

public static void main(String[] args) {
  RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
  List<String> jvmArgs = bean.getInputArguments();

  for (int i = 0; i < jvmArgs.size(); i++) {
    System.out.println( jvmArgs.get( i ) );
  }
  System.out.println(" -classpath " + System.getProperty("java.class.path"));
  // print the non-JVM command line arguments
  // print name of the main class with its arguments, like org.ClassName param1 param2
  System.out.println(" " + System.getProperty("sun.java.command"));
}

getInputArgumentsの javadoc

main メソッドへの引数を含まない Java 仮想マシンに渡された入力引数を返します。Java 仮想マシンへの入力引数がない場合、このメソッドは空のリストを返します。

一部の Java 仮想マシンの実装では、複数の異なるソースから入力引数を取得する場合があります。たとえば、「java」コマンド、環境変数、構成ファイルなど、Java 仮想マシンを起動するアプリケーションから渡される引数などです。

通常、「java」コマンドのすべてのコマンドライン オプションが Java 仮想マシンに渡されるわけではありません。したがって、返される入力引数には、すべてのコマンドライン オプションが含まれていない場合があります。

jpsもご覧ください。

これは、メイン クラスの完全なクラス名と JVM オプションを含む、すべての Java プロセスの完全なコマンド ラインを取得できる Java プログラムです。

Java Application Launcherへのリンクを含む、 さまざまなJVM ツールの優れた概要を見つけることができます。

于 2013-01-02T12:28:07.600 に答える
18

これを使用して、VM パラメーターを取得できます。

public static void main(String args[]) {
    List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
    System.out.println("input arguments = " + inputArguments);
}

ただし、すべてのコマンド ラインが表示されるわけではありません (JVM 引数のみが表示され、メイン クラスやパラメーターは表示されません)。出力例:

入力引数 = [-Dfile.encoding=UTF-8, -XX:-UseTLAB, -Xms2000m, -Xmx2000m, -XX:+PrintCompilation, -XX:+PrintGC]

于 2012-12-19T18:03:33.127 に答える
7

Linuxマシンで実行する方が簡単です:

ps -ef | grep java

このコマンドは、使用されているパラメーターで実行されているすべての Java プログラムを一覧表示します。

Windows 環境で何が使用できるかは不明です。

于 2012-12-28T11:52:20.363 に答える
7

 Sun   Oracle JVMでのみ動作します。System.getProperty("sun.java.command")

さらに、JavaSysMonを見ることができます。アクティブなプロセスのコマンドラインを報告できます。現在の JVM プロセスを確認するには、ここを確認してください: How can a Java program get its own process ID?

于 2012-12-28T01:36:11.777 に答える
5

Win2003 のタスク マネージャでは、Linux の場合と同様に、コマンドを表示する列の表示を有効にすることができます。または、次のようにコマンド ラインから行うこともできます。

wmic.exe PROCESS where "name like '%java%'" get Processid,Caption,Commandline
于 2013-01-03T17:22:29.000 に答える