在Java命令行中设置多个系统属性

82

有没有更简单的方法在命令行上指定多个系统属性给Java程序,而不是使用多个-D语句?

试图避免这种情况:

 java -jar -DNAME="myName" -DVERSION="1.0" -DLOCATION="home" program.jar

我曾经看到过有人使用一个-D,然后在其后添加一些带引号的字符串作为示例,但现在我找不到那个示例了。


8
从Java 9开始,您可以将这些选项中的一部分或全部(例如-DNAME="myName" -DVERSION="1.0" -DLOCATION="home" -jar program.jar)放入纯文本文件中,然后使用“参数文件”语法运行java启动器,例如java @that_plain_text_file - Ti Strga
5个回答

65

答案是否定的。您可能已经看到了一个示例,其中某人会设置类似以下内容:

-DArguments=a=1,b=2,c=3,d=4,e=cow

然后应用程序将解析Arguments属性字符串的值以获取各个值。 在您的main函数中,您可以获取键值(假设输入格式已保证):

String line = System.getProperty("Arguments");
if(line != null) {
  String str[] = line.split(",");
    for(int i=1;i<str.length;i++){
        String arr[] = str[i].split("=");
        System.out.println("Key = " + arr[0]);
        System.out.println("Value = " +  arr[1]);
    }
}

此外,在Java命令行中,-D应该在主类或jar文件之前。例子:java -DArguments=a=1,b=2,c=3,d=4,e=cow MainClass


1
另外,-D 应该在主类或 jar 文件之前。谢谢!你救了我。 - 17hao
如果你使用--key=value而不是-Dkey-value,参数可以在-jar之后出现。 - gaoagong

22

文档上没有提到任何类似的内容。

这里是一个引用:

-Dproperty=value 设置系统属性值。如果value是包含空格的字符串,则必须用双引号括起来:

java -Dfoo="some string" SomeClass


SomeClass 是指哪个类?我正在尝试使用 Spring、Struts 和 Tomcat 8.5 设置此属性以读取 .properties 文件,这是命令中唯一仍不清楚的部分。 - Frakcool
@Frakcool SomeClass将是您正在尝试运行的具有主方法的类。通常它会有一个包声明,您应该使用完全限定的类名来运行它。 - adarshr
哦,我明白了,这正是我所想的,但在 Web 应用程序中没有 main 方法,所以我认为它是在 Tomcat 的属性中完成的,我是对的吗? - Frakcool
@Frakcool,设置系统属性有多种方法。这个问题是关于如何从命令行设置它们的。您还可以尝试通过设置必需的系统属性来查看 JAVA_OPTS 环境变量。 - adarshr
谢谢 :) 我感激你的帮助 - Frakcool

17

不必将属性作为参数传递,您可以使用 .properties 文件来存储它们。


5
您可以使用System.getProperties().load(new FileInputStream("my.properties"))将它们加载到系统属性中,但拥有自己的Properties可能是更好的方法。 - Peter Lawrey

9
您可以使用JAVA_TOOL_OPTIONS环境变量来设置选项。 在Rasbian上,它对我很有效。请参见环境变量和系统属性,其中提到:

在许多环境中,命令行不容易被访问以使用必要的命令行选项启动应用程序。

这通常发生在使用嵌入式VM(意味着它们使用Java本机接口(JNI)调用API来启动VM)或启动深度嵌套于脚本中的应用程序中。 在这些环境中,JAVA_TOOL_OPTIONS环境变量可用于增强命令行。

当设置了此环境变量时,在JNI Invocation API中的JNI_CreateJavaVM函数将把环境变量的值添加到其JavaVMInitArgs参数中提供的选项中。

但是出于安全原因,可能已禁用此环境变量的使用。

在某些情况下,出于安全原因,会禁用此选项。例如,在Oracle Solaris操作系统上,当有效用户或组ID与实际ID不同时,将禁用此选项。

请参阅此示例,显示在命令行上指定与使用JAVA_TOOL_OPTIONS环境变量之间的差异。

显示使用JAVA_TOOL_OPTIONS环境变量的屏幕截图


0
如果需要在系统中设置所需的属性,则除了使用-D选项外,没有其他选择。 但是,如果您需要在引导应用程序时使用这些属性,则通过属性文件加载属性是最佳选择。这将不需要为单个属性更改构建。

使用“-D”方法如何需要为单个属性进行新的构建? - Koray Tugay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接