41

我想知道是否可以从代码中获取用于启动 java 程序的命令。

例如,如果我启动一个 java 程序:

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

我想获得确切的字符串(包括 jvm 参数)。

可能吗?


评论赏金和问题

谢谢大家的回复。不幸的是,我没有得到我最初想要的答案。我希望有一些可移植的解决方案可以从程序本身(包括类路径等)中获取完整的 java 命令。似乎没有可移植的解决方案,因为我使用的是 Linux,所以我使用agodinhostLuigi R. Viggiano的响应来解决我的问题。但是,我将赏金奖励给rahulroc以获得最完整(便携)的响应。对于其余的所有人都投赞成票:)

4

5 回答 5

25

下面提到的代码应该显示所有 JVM 参数、传递给 main 方法的参数以及主类名。

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

返回传递给 Java 虚拟机的输入参数,其中不包括 main 方法的参数。如果 Java 虚拟机没有输入参数,则此方法返回一个空列表。

一些 Java 虚拟机实现可能会从多个不同来源获取输入参数:例如,从启动 Java 虚拟机的应用程序传递的参数,例如“java”命令、环境变量、配置文件等。

通常,并非“java”命令的所有命令行选项都传递给 Java 虚拟机。因此,返回的输入参数可能不包括所有命令行选项。

你也可以看看:jps

它是一个 Java 程序,能够获取所有 Java 进程的完整命令行,包括主类的完整类名和 JVM 选项。

您可以找到各种JVM 工具的很好的总结,包括 Java Application Launcher链接到:

于 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

它仅适用于 Sun   Oracle JVM:System.getProperty("sun.java.command")

此外,您可以查看JavaSysMon,它可以报告活动进程的命令行。要检查当前的 JVM 进程,请在此处检查:Java 程序如何获取自己的进程 ID?

于 2012-12-28T01:36:11.777 回答
7

在 linux 机器上运行会更容易:

ps -ef | grep java

此命令将列出所有使用它使用的参数运行的 java 程序。

不确定在 Windows 环境中可以使用什么。

于 2012-12-28T11:52:20.363 回答
5

在 Win2003 的任务管理器中,您可以像在 linux 上一样启用显示命令的列的显示。或者,您可以从命令行执行此操作,如下所示:

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