【问题标题】:If I specify a System property multiple times when invoking JVM which value is used?如果我在调用 JVM 时多次指定系统属性,使用哪个值?
【发布时间】:2012-06-12 23:24:15
【问题描述】:

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

java -Dprop=A -Dprop=B -jar my.jar

拨打System.getProperty("prop");会有什么结果?

Java documentation 在这方面并没有真正告诉我任何有用的东西。

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

【问题讨论】:

  • 恕我直言,指定这有点像警告不要把你的猫放在微波炉里。为什么要两次指定相同的系统属性,除非你真的喜欢问题?
  • 在这种情况下,有一些 shell 脚本使用一些默认设置调用 JVM,但用户应该能够指定通过脚本传递给 JVM 的系统属性。
  • 啊,好的。很公平。我没有考虑过这个用例。
  • 我现在正在拼命想一个将猫放入微波炉的用例。

标签: java jvm system-properties


【解决方案1】:

没有什么比编写一个小类来看看它是如何工作的更好的了。

public class PropTest {

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

}

使用命令行编译和运行时

java -Dprop=A -Dprop=B -Dprop=C PropTest

产生输出

C

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

只是为了记下环境,Fedora 16, Linux 3.3.7, 64 bit

> 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)

【讨论】:

  • 这意味着将值从左到右放入表中,最后一个值会覆盖以前的值。可能会做出这样的假设,但 OP 已经尝试过这种例如,发现了相同的结果。不过,有什么实际规定的吗? 取决于这种行为是否有意义,或者这只是一个实现细节?
  • @JoshuaTaylor 通常,规范不涵盖这种极端情况。仅仅因为您暗示今天通常如何处理它并不意味着您可以假设将来会以这种方式处理它。规范编写者有足够的时间来详细说明所需的行为,而没有详细说明如何处理两到三次所需行为的原子的人:)
  • 规范编写者通常非常擅长处理特定细节。它可以简化和帮助标准化实施过程。例如,在支持命名参数(关键字参数)的 Common Lisp 中,您可以调用像 (print 52 :radix 10 :radix 8) 这样的标准 specifies '如果多个这样的参数对匹配,则使用最左边的参数对。 "
  • 我认为这些规范实际上对于命令行和参数列表处理非常重要,因为通常情况下用户/程序员确实希望能够覆盖,例如,通过执行类似program ${EXTRA_OPTIONS} -o default-o -f default-f 的操作。如果最左边的选项覆盖右边的选项,那么该代码允许用户通过定义 EXTRA_OPTIONS 覆盖默认值。这对于规范编写者来说似乎是一个相当合理的定义。
  • "如果您将最大堆大小设置为三倍," 仅此而已;我认为没有人声称、希望或期望将堆大小设置为三倍。我认为人们期望它只设置一次。问题是是否指定了java -Dheap=A -Dheap=B -Dheap=C 的行为以及堆是否具有明确的(单个)值。据我所知,它没有指定。规范编写者说“使用了最右边的设置”并不难,但他们似乎没有这样做。
【解决方案2】:

java.util.System 类由 Properties 类支持,它只是 Hashtable 的扩展。假设在作为参数传递给 JVM 时按顺序读取值,那么最后分配的值将是最终值。

【讨论】:

  • 嗯,这就是问题 - 我们可以安全地假设它们将始终从左到右阅读吗?
【解决方案3】:

我不确定是否有任何有关 Oracle 的文档。

根据IBM JRE documents

命令行上 Java 选项的顺序定义了启动期间哪些选项优先。最右边的选项优先于最左边的选项。

【讨论】:

  • +1;最后一个答案用实际规范(如要求)证实了 OP 的经验结果!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2012-11-25
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多