【问题标题】:Java System Environment VariableJava 系统环境变量
【发布时间】:2012-03-29 11:01:12
【问题描述】:

Java 是否有一个默认的系统环境变量,当我们设置它时总是会被读取/附加? CATALINA_OTPS/JAVA_OPTS 等似乎只适用于 TOMCAT/JBOSS 等。

  1. 我不想通过 Java 系统属性(通过 -Dprop1=value1 -Dprop2=value2 传入)设置它,因为它涉及 shell/batch 脚本。
  2. 它应该可以跨操作系统工作,就像在 Windows 中双击 jar 文件一样。
  3. 它应该适用于不同的 JRE(Sun、IBM、OpenJDK 等)。
  4. 不应涉及额外的编码。
  5. 它应该可以在大多数库配置文件中使用,例如设置 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 级别和最大内存堆大小运行。

【问题讨论】:

    标签: java environment-variables


    【解决方案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

    【讨论】:

    【解决方案2】:

    Java 有一个标准的 OS 系统环境变量,它总是在 JVM 启动时设置:

    • 操作系统名称
    • os.arch
    • os.version

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

    如果您需要更多信息,您可以随时使用Management API

    【讨论】:

    • 您是指 Java 管理扩展 (JMX) API 吗?如何在没有额外编码的情况下做到这一点?
    • 包含一个指向 Management API 的链接。不确定您所说的“额外编码”是什么意思,您必须至少编写一两行代码才能访问所需的信息。
    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 2011-10-26
    • 2015-08-20
    • 2015-09-16
    • 2019-01-19
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多