Java系统环境变量

12
Java有一个默认的系统环境变量吗?设置时这个变量总是会被读取/附加?似乎像CATALINA_OTPS/JAVA_OPTS等只适用于TOMCAT/JBOSS等。
  1. 我不想通过Java系统属性来设置它(这是通过-Dprop1=value1 -Dprop2=value2传入的),因为它涉及到shell/batch脚本。
  2. 它应该跨操作系统工作,例如在Windows双击jar文件。
  3. 它应该跨不同的JREs工作(Sun、IBM、OpenJDK等)。
  4. 它不应该涉及额外的编码。
  5. 它应该在大多数库的配置文件中起作用,例如设置log4j级别${LOG_LEVEL}。
更新:添加第四和第五项。从标题中删除操作系统以使我的问题更清晰。 更新2:查看Perception的答案后,似乎我的第2和第3项可以通过System.getenv实现。如何实现第4和第5项?
以下是一个场景示例: 假设现在JAVA_DEFAULT_OPTS是Java将读取的环境变量,因为它现在已成为标准。在开发桌面机器上,我设置JAVA_DEFAULT_OPTS=-DLOG_LEVEL=DEBUG -Xmx384m;在生产服务器机器上,客户设置JAVA_DEFAULT_OPTS=-DLOG_LEVEL=INFO -Xmx1024m。当我/用户在Windows上双击jar文件时,应用程序将以不同的log4j级别和最大内存堆大小运行。
2个回答

18

有一个特殊的环境变量叫做_JAVA_OPTIONS,JVM(java.exe)将会读取它的值。

在Windows中:

set _JAVA_OPTIONS=-Xms64m -Xmx128m -Dawt.useSystemAAFontSettings=lcd
在Linux中:
export _JAVA_OPTIONS='-Xms64m -Xmx128m -Dawt.useSystemAAFontSettings=lcd'

对于Java Web Start,它是JAVAWS_VM_ARGS。对于javaw.exe(Applet),它是_JPI_VM_OPTIONS


编辑20201213

_JAVA_OPTIONS环境变量可以使用,但未被记录或支持。

由于它不是标准化的,其他厂商有自己的名称,例如IBM_JAVA_OPTIONS。前导下划线名称按约定是私有的,因此将_JAVA_OPTIONS的用法标准化不是一个好主意。

这就是为什么首选JAVA_TOOL_OPTIONS

参考:https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#tooloptions


它可以工作。至少在Windows上使用Sun JRE。Linux也应该可以(https://dev59.com/eHNA5IYBdhLWcg3wpfmu#1508684)。如果Mac也可以,请让我知道。这是一个彩蛋吗?它甚至没有在http://docs.oracle.com/javase/6/docs/technotes/tools/windows/java.html上正式记录。我应该几年前就问了... :( - Lee Chee Kiam
@CKLee,你可以在Java 2D文档 https://docs.oracle.com/javase/8/docs/technotes/guides/2d/flags.html 和 http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/plugin.html 中找到相关信息。 - RealHowTo

1
Java有一个标准的操作系统环境变量,当JVM启动时会自动设置:
  • os.name
  • os.arch
  • os.version

所有可通过'System.getProperty(propertyName)`访问

如果您需要更多的内容,您可以使用管理API


您是指Java管理扩展(JMX)API吗?如何在不进行额外编码的情况下完成呢? - Lee Chee Kiam
包含了管理 API 的链接。不确定您所说的“额外编码”是什么意思,但您必须编写至少一到两行代码来访问所需的信息。 - Perception

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接