用main方法得到一个Java类,例如com.foo.Bar。但是此类有两个可选的vm(system)参数,例如key1,key2。

创建了一个批处理和Shell Shell脚本来分别调用以下程序。

批处理文件的内容(barRunner.cmd

@echo off
set CLASSPATH=/bla/;/bla/
java -cp %CLASSPATH% com.foo.Bar %*


Shell脚本的内容(barRunner.sh

export CLASSPATH=/bla/:/bla/
java -cp $CLASSPATH com.foo.Bar $@


现在,用户以以下方式调用,但是Bar类无法读取vm参数

barRunner.cmd -Dkey1=value1


要么

./barRunner.sh -Dkey2=value2 -Dkey1=value1


怀疑在类之后传递了vm参数。

如何传递vm参数,以便它们在类名之前可用?

编辑:

已经尝试了如下更改脚本并成功。但是问题在于类是否具有程序参数。

java -cp %CLASSPATH% %* com.foo.Bar


也了解JAVA_OPTS,但是对于天真的用户来说有点繁琐。我的意思是,要运行多个命令(在一个命令中设置JAVA_OPTS&在另一行中调用脚本),犹豫要使用这种方式。

因此,考虑与论坛进行检查,是否有更好的方法可以在一行中同时实现vm和program参数,并且两个args都是可选的。

最佳答案

VM参数应该在类名之前传递,否则参数将成为您的程序参数,因此您的命令应为:

java -cp $CLASSPATH "$@" com.foo.Bar

使用上面的命令,您可以使用./barRunner.sh -Dkey2=value2 -Dkey1=value1运行。

现在有个小问题是所有参数都作为VM参数传递。您可能还希望将一些参数传递给您的程序。为此,您可以执行以下操作:

java -cp $CLASSPATH $JVM_ARGS com.foo.Bar "$@"

使用以上命令,您可以同时传递JVM参数和程序参数,例如,

JVM_ARGS="-Dkey2=value2 -Dkey1=value1" ./barRunner.sh programArg1 programArg2

07-28 03:33
查看更多