如果我在调用JVM时多次指定一个System属性使用哪个值?

Rob*_*obV 19 java jvm system-properties

如果我在调用JVM时多次指定系统属性,当我检索属性时,我将实际得到哪个值?例如

java -Dprop=A -Dprop=B -jar my.jar
Run Code Online (Sandbox Code Playgroud)

我打电话的结果是什么System.getProperty("prop");

关于这个的Java文档并没有真正告诉我这方面有用的东西.

在我对运行不同JVM的几台机器进行的非科学测试中,似乎最后一个值是返回的值(这实际上是我需要的行为)但是我想知道这种行为是否在任何地方正式定义,或者它是否可以在JVM之间变化?

Edw*_*uck 15

没有什么比写一个小班看看它是如何工作的了.

public class PropTest {

  public static void main(String[] args) {
    System.out.println(System.getProperty("prop"));
  }

}
Run Code Online (Sandbox Code Playgroud)

在使用命令行编译和运行时

java -Dprop=A -Dprop=B -Dprop=C PropTest
Run Code Online (Sandbox Code Playgroud)

输出结果

C
Run Code Online (Sandbox Code Playgroud)

这意味着值从左到右放入表中,最后一个值覆盖以前的值.

只是为了记录环境,Fedora 16,Linux 3.3.7,64位

> java -version

java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.1) (fedora-65.1.11.1.fc16-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)

  • **"如果你设置最大堆大小三次,"**就是这样,但是; 我不认为任何人声称,或希望或期望堆大小设置三次.我认为人们期待它只被设置一次.问题是是否指定了`java -Dheap = A -Dheap = B -Dheap = C`的行为以及堆是否具有明确的(单个)值.据我所知,它没有具体说明.规范编写者说"使用最右边的设置"并不困难,但似乎并没有这样做. (3认同)
  • **这意味着值从左到右放入表中,最后一个值覆盖以前的值.**可能会做出这样的假设,但OP已经尝试过这种示例并找到了相同的结果.但是,有什么实际规定这个吗?*依赖*这个行为是否有意义,或者这只是一个实现细节? (2认同)

tjg*_*184 7

java.util.System类由Properties类支持,该类只是Hashtable的扩展.假设在作为参数传递给JVM时按顺序读取值,则分配的最后一个值可能是该值.

  • 嗯,这就是问题 - 我们能否安全地假设他们将永远被从左到右阅读? (5认同)