Java系统属性用于设置和获取任意程序参数是否正确?

Java系统属性用于设置和获取任意程序参数是否正确?,java,Java,可以使用-Dproperty=value参数设置任意系统属性(不是JVM实际使用的某个固定的系统属性集),程序可以在以后使用system.getProperty(“属性”)获取这些属性。这样做对吗 我还没有找到一个权威的答案,所以我在这里问。在我看来,程序参数应该通过命令行参数设置到程序,而不是JVM。然而,也许这是一个公认的做法,只是没有记录在任何地方我已经看过。我想确定一下。谢谢。在我看来,这并不是“不正确的”,有些程序和库确实使用自己的系统属性进行配置 但是,将软件的配置参数放入配置文件(

可以使用
-Dproperty=value
参数设置任意系统属性(不是JVM实际使用的某个固定的系统属性集),程序可以在以后使用
system.getProperty(“属性”)
获取这些属性。这样做对吗

我还没有找到一个权威的答案,所以我在这里问。在我看来,程序参数应该通过命令行参数设置到程序,而不是JVM。然而,也许这是一个公认的做法,只是没有记录在任何地方我已经看过。我想确定一下。谢谢。

在我看来,这并不是“不正确的”,有些程序和库确实使用自己的系统属性进行配置


但是,将软件的配置参数放入配置文件(以您认为合适的任何格式—一个
.properties
文件、一个XML文件或其他文件)可能更为实际。必须使用
-Dname=value
选项将所有这些参数放在命令行上是很麻烦的,尤其是当您有许多配置参数时。

您可以使用此方法设置一些应用程序设置。我认为设置是与程序参数的对比。例如让我们考虑一些文件转换器。它将文件A转换为B。因此文件A和B应该是命令行参数。如果转换器需要一些临时文件夹,可以通过
-Dmy.package.tempfolder=\my\tmp\folder
设置id。但是应该有一个默认设置,程序应该在没有这个设置的情况下工作


可以将其视为.properties文件的替代文件。属性文件当然会更方便。

我认为Java系统属性用于将值从命令行传递到执行中的库或插件。就是说,内部组件没有直接的方法从执行它的主程序接收参数。因此,它从一个“上下文”中读取Java系统属性

如果我们将其视为层,那么命令行参数将是inmediate较低层的参数,系统java属性是所有较低层的上下文

command line: arguments + properties
   main program: uses arguments
      some library/plugin: uses properties from context
如果不是这样,主程序就必须携带用户可以设置到较低层的所有参数,这可能非常麻烦


我不喜欢依赖上下文属性,所以如果我设计一个程序,我会尝试以非全局的方式传递所有属性。但有时它非常方便(使用名称空间,它们不太可能发生冲突)。

你只需要知道自己在做什么。如果您的应用程序是一个独立的应用程序,那么系统属性提供了一种简单易用的方法,可以将命名参数以任何顺序传递给程序,我认为使用它们并没有什么本质上的坏处

如果您的应用程序是一个必须部署在多个Web应用程序共享的应用程序服务器中的Web应用程序,那么这可能不是一个好主意,尤其是如果不允许您更改服务器的启动方式,或者如果您必须部署同一应用程序的多个版本。

来自:

例如,下面对getProperty的调用将查找 名为subliminal.message的系统属性。这不是一个有效的系统 属性,因此此方法不返回null,而是返回 作为第二个参数提供的默认值:“Buy StayPuft 棉花糖!”

System.getProperty(“subminal.message”,
“买StayPuft棉花糖!”

这意味着JVM使用的属性以外的属性是“无效的”。但是,在同一文档的后面部分,它给出了加载包含相同属性设置的属性文件的示例

潜意识。信息=购买StayPuft棉花糖

它只建议“一般来说,注意不要覆盖系统属性。”

因此,这似乎是对系统属性的支持使用。这看起来像是一个误导性的命名案例。当我听到“系统属性”时,我想到“JVM的属性”,JVM就是系统。虽然属性用于此目的,但它们也可用于应用程序设置。我想我会记下一点,将其视为“系统和应用程序属性”


有人不同意这一点吗?

为什么不使用第三个命令行参数而不是系统属性来设置文件夹?我很想知道,当它们实际上是JVM系统属性时,为什么这些被视为“程序设置”。理论上,它们可能会与未来的JVM系统属性冲突,或者JVM可能会忽略未使用的属性,而这只是意外使用的未定义行为。可以将其视为最大JVM内存堆、日志级别等设置。这不会改变程序的逻辑,只会改变环境。当然,您可以添加第三个命令行参数,但如果只有2%的用户会使用它,为什么要使程序的“API”复杂化呢?最好使用包名,以免与其他系统属性冲突。一些库(例如java.util.logging)使用系统设置传递一些配置参数。例如,您可以使用
java.util.logging.config.file
设置更改日志记录行为,也可以使用一些系统道具更改Swing主题。您可以在任何使用JUL或Swing的Java应用程序中执行此操作,但不应将它们全部作为命令行参数处理。您能看到区别吗?同意,但这些也可以用于指定一个、两个或少数属性文件(在本例中使用它们)。这些不应该只是命令行参数吗?我可以看出,以这种方式使用系统属性是有用的和灵活的,我只是想听听是否有任何理由这样做,或者它是否是某种指定的可接受的用法,或者它是否刚刚发生