74

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

试图避免这种情况:

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

我以为我已经看到有人使用一个-D和一些引用的字符串的例子,但我再也找不到这个例子了。

4

5 回答 5

62

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

-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]);
    }
}

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

于 2011-09-16T00:53:27.587 回答
20

文档中没有提到任何类似的东西。

这是一个报价:

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

java -Dfoo="some string" SomeClass

于 2011-09-08T16:48:39.523 回答
17

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

于 2011-09-08T17:06:25.067 回答
6

您也许可以使用JAVA_TOOL_OPTIONS环境变量来设置选项。它对我有用 Rasbian。请参阅环境变量和系统属性,其中包含以下内容:

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

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

设置此环境变量时,JNI_CreateJavaVM 函数(在 JNI 调用 API 中),JNI_CreateJavaVM 函数将环境变量的值添加到其 JavaVMInitArgs 参数中提供的选项中。

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

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

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

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

于 2018-01-13T05:27:25.157 回答
0

如果需要在系统中设置所需的属性,那么没有选项可以选择 -D 但是如果您在引导应用程序时需要这些属性,那么通过属性文件加载属性是最好的选择。它不需要更改单个属性的构建。

于 2016-08-19T09:55:24.037 回答