这些Java环境变量之间有什么区别?

时间:2014-09-22 01:32:02

标签: java command-line configuration jvm environment

Java环境变量_JAVA_OPTIONSJAVA_OPTIONS_JAVA_TOOLS_OPTIONSJAVA_TOOLS_OPTIONS_JAVA_OPTSJAVA_OPTS之间有什么区别?什么时候应该使用?这些是所有JVM规范的标准部分,还是仅适用于Oracle的JVM?

2 个答案:

答案 0 :(得分:0)

JAVA_TOOLS_OPTIONS是所有sun JVM的唯一标准部分,某些版本的IBM jdk也会读取它,但某些版本的非sun jdk可能会忽略它。

许多shell脚本可以读取其他变量,例如tomcat,maven。但这不是一种标准方式。

所以唯一的标准方法是在命令行中指定选项,并且使用shell脚本是一种广泛使用的方式。

答案 1 :(得分:0)

万一其他人因为 Google 搜索而被困在这个旧帖子上...

来自 OpenJDK 中的评论source code, as of Java 11

 * @implNote
 * The HotSpot JVM processes the input arguments from multiple sources
 * in the following order:
 * 1. JAVA_TOOL_OPTIONS environment variable
 * 2. Options from JNI Invocation API
 * 3. _JAVA_OPTIONS environment variable
 *
 * If VM options file is specified via -XX:VMOptionsFile, the vm options
 * file is read and expanded in place of -XX:VMOptionFile option.

来自matching unit tests

的评论
     * Here is the order of options processing and last argument wins:
     *    1) Flags file
     *    2) JAVA_TOOL_OPTIONS environment variables
     *    3) Pseudo command line from launcher
     *    4) _JAVA_OPTIONS
     * In every category arguments processed from left to right and from up to down
     * and the last processed arguments wins, i.e. if argument is defined several
     * times the value of argument will be equal to the last processed argument.

请注意,在该测试中,“标志文件”是通过 -XX:VMOptionsFile= 在命令行上传递的。
还要注意“伪命令行”中的限定符是指单元测试生成命令行的方式;对于正在测试的 JVM,它们与实际命令行选项没有区别。

该存储库的其他地方暗示 _JAVA_OPTIONS 是为了测试/调试目的而引入的。


底线:如果您是负责运行在 OpenJDK 之上的罐装 Java 应用程序的操作员,并且需要设置/覆盖某些 Java 属性,但不能通过命令行或应用程序级别的 env 执行此操作var (例如,Tomcat 的 CATALINA_OPTSJAVA_OPTS ...然后作为最后的手段

  • 要注入新属性,请使用 env var JAVA_TOOL_OPTIONS
  • 要覆盖固定应用内部设置的属性,请改用 _JAVA_OPTIONS