【问题标题】:Why has Java no standard API to access the command line arguments? [closed]为什么 Java 没有标准 API 来访问命令行参数? [关闭]
【发布时间】:2015-08-01 10:00:24
【问题描述】:

在纯 Java 程序中获取命令行参数的唯一方法是 main 入口方法。 java.lang.Systemjava.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


【解决方案1】:

在容器中,您将使用系统属性而不是参数。您可以使用 -Dkey=value 设置系统属性。除此之外,根本没有标准的 java API 来获取除 main 方法之外的参数。

【讨论】:

  • 是的,这是事实,我知道这一点。问题是为什么要这样设计?为什么要分离常规命令行参数及其 -D*** 子集,Java 将其解释为系统属性。
  • 我猜这是只有 sun/oracle 的 java 设计师才能回答的问题。
【解决方案2】:

如果您指的是应用程序的参数,则将它们放在“args”中:

public static void main(String[] args) {
           //...
}

如果您正在谈论与 VM 相关的参数 - 好吧,那不是您的事,对吧?它们可能依赖于虚拟机的供应商,它们可能依赖于平台......有很多理由希望在那里隔离。

【讨论】:

  • 请阅读问题的第一句话。我知道 main 方法,但是在可插拔容器环境(如 OSGi 或任何应用程序服务器)中,我无法访问此方法。
  • 哎呀,对不起......好吧 - 但 OSGi 也是关于隔离的 - 基本上,每个 OSGI 模块都有一个与世界其他地方定义的接触面。尽可能多地消除对运行时的依赖似乎是合理的做法?
  • jap,但是既然我们自然可以访问 env 变量,为什么不授予对命令行参数的访问权限呢?可能有一些我没有理解的深刻哲学
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多