我想知道是否可以从代码中获取用于启动java程序的命令。
E.g。如果我用:
启动一个java程序 java -cp lib1:lib2:... -jar mylib.jar com.foo.Bar
我想获得确切的字符串(包括jvm参数)。
有可能吗?
评论赏金和问题
谢谢大家的回复。不幸的是,我没有得到我最初寻找的答案。我希望有一些可移植的解决方案从程序本身(包括类路径等)中获取完整的java命令。因为似乎没有可移植的解决方案,因为我使用Linux,我使用 agodinhost 和 Luigi R. Viggiano 的响应来解决我的问题。但是,我将赏金给予 rahulroc 以获得最完整(便携)的响应。对于其他人来说,为所有人提供支持:)
答案 0 :(得分:22)
下面提到的代码应该显示所有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"));
}
的javadoc
返回传递给Java虚拟机的输入参数 不包括main方法的参数。此方法返回 如果Java虚拟输入没有输入参数,则为空列表 机。
某些Java虚拟机实现可能需要输入参数 来自多个不同的来源:例如,传递的参数 启动Java虚拟机的应用程序,如 'java'命令,环境变量,配置文件等。
通常,并非'java'命令的所有命令行选项都是 传递给Java虚拟机。因此,返回的输入参数 可能不包括所有命令行选项。
您还可以查看:jps
这是一个能够为所有人提供完整命令行的Java程序 Java进程,包括主类和JVM的完整类名 选项。
您可以找到各种JVM tools的完整摘要,包括 Java Application Launcher链接到:
ManagementFactory.getRuntimeMXBean(
) - 返回Java虚拟机的运行时系统的托管bean。 getInputArguments()
javadoc 答案 1 :(得分:19)
您可以使用this来检索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]
答案 2 :(得分:7)
它仅适用于 Sun Oracle JVM:System.getProperty("sun.java.command")
此外,您可以查看JavaSysMon,它可以报告活动进程的命令行。要检查当前JVM进程,请在此处查看:How can a Java program get its own process ID?
答案 3 :(得分:7)
会更容易运行:
ps -ef | grep java
此命令将列出使用其已使用参数运行的所有Java程序。
不确定Windows环境中可以使用的内容。
答案 4 :(得分:5)
在Win2003上的任务管理器中,您可以启用显示命令的列,就像在linux上一样。或者,您可以从命令行执行此操作:
wmic.exe PROCESS where "name like '%java%'" get Processid,Caption,Commandline