2010-03-29 141 views
13

从Java开始,是否有可能获得包含启动应用程序的所有参数的完整命令行?如何获取启动进程的命令行

System.getEnv()System.getProperties()似乎不包含这些值。

+2

你的意思是提供给jvm的参数吗?有一个相关的问题 http://stackoverflow.com/questions/1490869/how-to-get-vm-arguments-from-inside-of-java-application – LB40 2010-03-29 22:55:22

回答

12

有些是可以从RuntimeMXBean,通过调用ManagementFactory.getRuntimeMXBean()

获得然后可以,例如呼叫

针对的javadoc说:

返回传递的输入参数到不包含主方法参数的Java虚拟机。如果Java虚拟机没有输入参数,则此方法返回空列表。

某些Java虚拟机实现可能需要输入参数从多个不同的源:用于实施例中,从启动Java虚拟机应用程序传递参数如“Java的指令,环境变量,配置文件等

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

+2

我认为这是关于使用纯Java的最佳选择。 – msandiford 2010-03-29 23:05:25

+0

+1一些示例代码会让我完美! :) – OscarRyz 2010-04-08 18:13:07

+0

@Stephen Denne ...不是这个的粉丝。我对这个问题的理解是获得命令行(比如'ps -f'中显示的命令字符串),正如手册页所述,“_does不包含main方法的参数。”现在, m试图确定什么其他程序传递给我的类不可见的'main'。 – will 2018-02-07 03:38:32

1

在Linux/UNIX的,当你得到该命令(在shell中运行)的输出,应该是可能的

cat /proc/$PPID/cmdline 

但是,这是不可移植的所有,因此不应在Java中使用.. 。

+0

好的,谢谢。如果它不是可移植的,那也可以,但是我也需要它在Windows上工作。 – aksamit 2010-03-29 22:20:34

+2

@aksamit - 换句话说,你需要它可以在(至少)Linux和Windows之间移植......呃! @Johannes - “因此不应该在Java中使用”太强大了。在Java中编写不可移植的代码并不完全错误......如果情况需要的话。 – 2010-03-29 23:30:31

+0

@JohannesWeiß:so太阳只是在他们决定把* Runtime.exec *放在正确的时候出于他们的想法?我的意思是,它显然没有任何需要,应该从语言中去除,以取悦“纯粹的爪哇神”?要么 ? – SyntaxT3rr0r 2010-03-30 00:37:10

0

你可能想看看如何jps这样做。这是一个Java程序,它能够获得所有Java进程的完整命令行,包括主类和JVM选项的完整类名。

0

我以前用来维护跨平台闪耀的一个选项是在发出命令之前将命令行设置为环境变量。

1

有一个环境变量%〜DP0返回的完整路径

+1

On ...哪个操作系统? – OscarRyz 2010-04-08 18:13:36

+1

糟糕..我忘记了它是在windows中。非常有用地运行切换到UNC路径例如 UNC路径\\ Server \ share \ folder1 \ runit.bat 如果批处理的第一行被pushd%〜dp0那么你当前的路径将是\\ Server \ share \ folder1 \ – ggonsalv 2010-04-17 03:49:37

+0

答案与我为什么找到这个问题无关,但对于知道有用。 – 2011-10-23 16:32:58

0

看一看YAJSW(然而,另一个Java服务包装器) - 它为各种操作系统(包括Win32和Linux)基于JNA-实现,做到这一点,以便它可以抓住正在运行的进程的命令行并创建一个将其包装在服务中的配置。多一点信息here

0

如果您使用solaris作为操作系统,请查看“pargs”实用程序。打印所有需要的信息。

相关问题