【发布时间】:2015-08-01 10:00:24
【问题描述】:
在纯 Java 程序中获取命令行参数的唯一方法是 main 入口方法。 java.lang.System 和 java.lang.Runtime 都没有访问参数的方法。
有一个
-Dkey=value命令行参数子集,JDK 将其解析并解释为“系统属性”,并且确实有 API 可以获取这些。但是对于常规程序 args,没有任何这样的 API。有一个虚假的
sun.java.command系统属性,它在普通 Java 中有效,但在运行的 Equinox 中似乎无效(使用 Oracle JDK 1.8.0_31 进行了尝试)。 S.这个话题Is it possible to get the command used to launch the jvm in java?在 Equinox 中,他们引入了
EnvironmentInfo服务,它提供了这样的 API,但是它的实现很奇怪(OSGi 服务和公共静态的混合)并且在服务非常依赖于OSGi 框架启动器初始化它的方式。我们直到最近才使用它,但现在遇到了一个非常令人不快的问题,即服务存在但尚未由 (BND) 启动器静态初始化。
为什么没有任何标准方法可以从代码中的任何位置以静态方式访问 Java 中的命令行参数?是 JDK 的设计缺陷还是背后有一些故意的想法?
【问题讨论】:
-
您需要通过哪种其他方式访问参数?在我看来,真正的主要方法是获取命令行参数的标准方法。
-
肯定是这样,但是在容器环境中我没有任何访问主要的权限,所以我希望有类似 System.getCommandLineArgs() 的东西(类似于获取环境和系统属性)
-
是什么阻止了您在整个应用程序可用的某个类中调用 setter 到静态变量?
-
可以说容器被设计为 headless 进程并且应该只依赖 config/properties 文件,而独立/桌面应用程序应该使用命令行参数跨度>
-
Java 使普通参数可用于 main。如果容器库决定不给你 API,那是容器库的设计决定。
标签: java command-line osgi command-line-arguments equinox