当前位置: 首页 > 面试题库 >

使用Java 11时,JDK_JAVA_OPTIONS和JAVA_TOOL_OPTIONS有什么区别?

陈晟睿
2023-03-14
问题内容

使用Java
11时,JDK_JAVA_OPTIONS和JAVA_TOOL_OPTIONS之间的确切区别是什么?

它们似乎执行相同的操作,但是输出略有不同。这使我相信他们可能有不同的用例:

$ JDK_JAVA_OPTIONS="-Dstuff" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff

$ JDK_JAVA_OPTIONS="illegalStuff" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: illegalStuff
Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS

$ JAVA_TOOL_OPTIONS="-Dstuff" java Foo
Picked up JAVA_TOOL_OPTIONS: -Dstuff

$ JAVA_TOOL_OPTIONS="illegalStuff" java Foo
Picked up JAVA_TOOL_OPTIONS: illegalStuff
Unrecognized option: illegalStuff
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

我正在使用一个很小的测试程序:

public class Yo {
  public static final void main(String[] args) {
    System.out.println(System.getProperty("stuff"));
  }
}

它显示JDK_JAVA_OPTIONS优先于JAVA_TOOL_OPTIONS

$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" java Yo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff=jdk
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool
jdk

但是最终命令行胜出了:

$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" java -Dstuff=cmd Yo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff=jdk
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool
cmd

但是,在构建时,仅JAVA_TOOL_OPTIONS读取:

$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" javac Yo.java
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool

我目前正在使用AdoptOpenJDK 11 build 28。


问题答案:

@gjoranv的答案解释了两个变量之间的功能差异。

我认为输出的差异源于以下方面:

  1. 这两个变量似乎在启动过程中的不同地方实现。

  2. JDK_JAVA_OPTIONS文档说:

为了减轻对JDK_JAVA_OPTIONS行为的潜在滥用,环境变量中不允许指定主类(例如-
jar)或导致Java启动器退出而不执行主类(例如-h)的选项。如果这些选项中的任何一个出现在环境变量中,启动器将中止并显示一条错误消息。

这行:

     Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS

是错误消息,警告用户可能通过该变量进行混乱操作。

我认为这JDK_JAVA_OPTIONS是优先的,部分原因是相同的。



 类似资料:
  • 问题内容: 这些环境变量何时应使用? 问题答案: 请参阅“什么是”文档和“工具选项”文档 基本上,它是供开发工具,监视工具等使用的,而用于运行“通用” Java程序的,我认为人们倾向于混合和匹配(从Google的示例中可以看出)。

  • 问题内容: 请帮助我了解在哪里使用常规JOIN和JOIN FETCH。 例如,如果我们有这两个查询 和 它们之间有什么区别吗?如果是,何时使用哪个? 问题答案: 在这两个查询中,你正在使用JOIN查询与至少一个部门关联的所有员工。 但是,不同之处在于:在第一个查询中,你仅返回hibernate的Employes。在第二个查询中,你将返回员工和所有关联的部门。 因此,如果你使用第二个查询,则无需执行

  • 问题内容: 和之间有什么区别? 对于: 问题答案: 调用(或其别名)时,您将bash脚本加载并执行 到 当前 bash进程中。所以你可以 读取在源脚本中设置的变量, 使用其中定义的功能。 甚至在脚本执行的情况下执行fork和/或子进程。 调用时,您将启动一个 fork (子进程或 子 进程),该 fork 运行新的会话,通常是的符号链接。在这种情况下,子脚本完成时将删除由子脚本设置的环境变量。 注

  • 本文向大家介绍使用PropTypes和Flow有什么区别?相关面试题,主要包含被问及使用PropTypes和Flow有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 Flow 是一个针对react项目所有 JavaScript 代码的静态类型检测器,需要单独添加依赖并手动运行 PropTypes是针对组件级别的类型检测

  • 我是Rust的新手。我认为用于将标识符导入当前范围,用于声明外部模块。但是这种理解(可能是错误的)对我来说没有任何意义。有人能解释一下为什么Rust有这两个概念以及适合使用它们的情况吗?

  • 问题内容: 使用Mockito间谍的用例是什么? 在我看来,每个间谍用例都可以使用callRealMethod进行模拟处理。 我可以看到的一个区别是,如果您希望大多数方法调用都是真实的,则可以节省一些代码行以使用模拟与间谍。是这样还是我错过了更大的前景? 问题答案: 答案在文档中: 真正的部分模拟(自1.8.0开始) 最后,在邮件列表上进行了许多内部辩论和讨论之后,Mockito添加了部分模拟支持