自定义JVM参数与常规程序参数

时间:2017-06-26 11:52:22

标签: java command-line jvm

是否存在使用常规程序参数无法复制的自定义JVM参数(what are custom jvm properties?)的用例?换句话说,它们是严格必要的还是仅仅是编程方便?

以下是严格必要的JVM参数的用例:

java -jar -DmyCustomArg="my_value" MyFile.jar

MyFile中的某个地方是以下代码,取出属性:

String s = System.getProperty("myCustomArg");

此属性不是严格必需,因为我们可以按如下方式替换它:

  1. 在MyFile中声明一个地图类,例如一个HashMap映射键值对,并使用单例模式实例化一个实例,以便在整个程序中使用
  2. 读入名为myCustomArg的程序参数,有关程序和JVM系统参数之间的区别,请参阅Proper usage of Java -D command-line parameters
  3. 将代码添加到MyFile以将程序参数加载到哈希映射
  4. 使用哈希映射检索替换上述系统属性检索
  5. 显然,要完成以上所有操作将比添加&检索JVM属性。但是我的问题是:两者之间是否存在定性差异,即是否存在JVM参数的用例,其中无法通过常规程序参数实现相同的功能?或者,我们添加的自定义JVM参数只是一种方便,可以让我们避免像Map一样声明和使用我们自己的Properties对象吗?

1 个答案:

答案 0 :(得分:0)

在您希望通过环境变量控制应用程序启动的情况下(例如,在使用docker时),对属性进行-D覆盖是非常好的。对于spring和其他框架,通常会有一个查找属性的正确配置值的查找顺序,通过JVM参数覆盖它是首先查看jar文件或文件系统中的属性文件后的最终回退。还有许多特定于java本身的系统属性,用于管理默认编码,代理,dns缓存等内容。

这里最重要的是最少惊喜的原则。这就是配置如何在Java中运行并且已经工作了大约20年。如果你愿意,你可以解决它,但为什么要这样做呢?换句话说,你对此有何反对意见?