Java 系统环境变量
Posted
技术标签:
【中文标题】Java 系统环境变量【英文标题】:Java System Environment Variable 【发布时间】:2012-03-29 11:01:12 【问题描述】:Java 是否有一个默认的系统环境变量,当我们设置它时总是会被读取/附加? CATALINA_OTPS
/JAVA_OPTS
等似乎只适用于 TOMCAT/JBOSS 等。
-
我不想通过 Java 系统属性(通过 -Dprop1=value1 -Dprop2=value2 传入)设置它,因为它涉及 shell/batch 脚本。
它应该可以跨操作系统工作,就像在 Windows 中双击 jar 文件一样。
它应该适用于不同的 JRE(Sun、IBM、OpenJDK 等)。
不应涉及额外的编码。
它应该可以在大多数库配置文件中使用,例如设置 log4j
级别 $LOG_LEVEL。
更新:添加了第 4 项和第 5 项。从标题中删除 OS 以使我的问题更清楚。
更新 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 级别和最大内存堆大小运行。
【问题讨论】:
【参考方案1】:有一个特殊的环境变量_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
【讨论】:
它有效。至少在带有 Sun JRE 的 Windows 中。 Linux 应该也能正常工作 (***.com/a/1508684/418439)。任何人都让我知道Mac是否也可以工作。这是复活节彩蛋吗?它甚至没有在docs.oracle.com/javase/6/docs/technotes/tools/windows/java.html 正式记录。几年前我应该问这个...... :( @CKLee ,您可以在 Java 2D 文档docs.oracle.com/javase/8/docs/technotes/guides/2d/flags.html 和 docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/… 中找到它的提及【参考方案2】:Java 有一个标准的 OS 系统环境变量,它总是在 JVM 启动时设置:
操作系统名称 os.arch os.version所有可通过 'System.getProperty(propertyName)` 访问
如果您需要更多信息,您可以随时使用Management API。
【讨论】:
您是指 Java 管理扩展 (JMX) API 吗?如何在没有额外编码的情况下做到这一点? 包含一个指向 Management API 的链接。不确定您所说的“额外编码”是什么意思,您必须至少编写一两行代码才能访问所需的信息。以上是关于Java 系统环境变量的主要内容,如果未能解决你的问题,请参考以下文章