【问题标题】:Missing java.compiler system property缺少 java.compiler 系统属性
【发布时间】:2017-04-11 14:52:40
【问题描述】:

我正在使用 Java 8。According to the docs,系统属性 java.compiler 应该存在。然而,当我运行一个基本类时,它不是。

import java.util.Comparator;
import java.util.Map;

public class SystemPropertiesPrinter {

    public static void main(String[] args) {
        Map<String, String> properties = (Map) System.getProperties(); // It's a pain to sort without this artificial cast
        properties.entrySet().stream()
                .sorted(Comparator.comparing(Map.Entry::getKey))
                .forEach(e -> System.out.printf("%-30s -> %s%n", e.getKey(), e.getValue()));
    }

}

我使用以下命令运行它:

java SystemPropertiesPrinter

结果如下:

awt.toolkit                    -> sun.awt.windows.WToolkit
file.encoding                  -> Cp1252
file.encoding.pkg              -> sun.io
file.separator                 -> \
java.awt.graphicsenv           -> sun.awt.Win32GraphicsEnvironment
java.awt.printerjob            -> sun.awt.windows.WPrinterJob
java.class.path                -> .
java.class.version             -> 52.0
java.endorsed.dirs             -> C:\Program Files\Java\jdk1.8.0_66\jre\lib\endorsed
java.ext.dirs                  -> C:\Program Files\Java\jdk1.8.0_66\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
java.home                      -> C:\Program Files\Java\jdk1.8.0_66\jre
java.io.tmpdir                 -> C:\dev\cygwin64\tmp\
java.library.path              -> <edited out>
java.runtime.name              -> Java(TM) SE Runtime Environment
java.runtime.version           -> 1.8.0_66-b18
java.specification.name        -> Java Platform API Specification
java.specification.vendor      -> Oracle Corporation
java.specification.version     -> 1.8
java.vendor                    -> Oracle Corporation
java.vendor.url                -> http://java.oracle.com/
java.vendor.url.bug            -> http://bugreport.sun.com/bugreport/
java.version                   -> 1.8.0_66
java.vm.info                   -> mixed mode
java.vm.name                   -> Java HotSpot(TM) 64-Bit Server VM
java.vm.specification.name     -> Java Virtual Machine Specification
java.vm.specification.vendor   -> Oracle Corporation
java.vm.specification.version  -> 1.8
java.vm.vendor                 -> Oracle Corporation
java.vm.version                -> 25.66-b18
line.separator                 ->

os.arch                        -> amd64
os.name                        -> Windows 7
os.version                     -> 6.1
path.separator                 -> ;
sun.arch.data.model            -> 64
sun.boot.class.path            -> <edited out>
sun.boot.library.path          -> C:\Program Files\Java\jdk1.8.0_66\jre\bin
sun.cpu.endian                 -> little
sun.cpu.isalist                -> amd64
sun.desktop                    -> windows
sun.io.unicode.encoding        -> UnicodeLittle
sun.java.command               -> SystemPropertiesPrinter
sun.java.launcher              -> SUN_STANDARD
sun.jnu.encoding               -> Cp1252
sun.management.compiler        -> HotSpot 64-Bit Tiered Compilers
sun.os.patch.level             -> Service Pack 1
user.country                   -> GB
user.dir                       -> C:\Users\olivier\tmp
user.home                      -> C:\Users\olivier
user.language                  -> en
user.name                      -> olivier
user.script                    ->
user.timezone                  ->
user.variant                   ->

如您所见,java.compiler 属性不在我的列表中。这是正常的吗?如果我们参考文档,特别是因为它没有被标记为“已弃用”,它不应该存在吗? This question 声明这个属性可以取特定值,但它没有提到它可以不存在。

【问题讨论】:

    标签: java system-properties


    【解决方案1】:

    根据文档,系统属性java.compiler 应该存在

    不,这不是文档所说的。

    来自文档:

    getProperty(String) 方法使用的当前系统属性集作为 Properties 对象返回。如果当前没有一组系统属性,首先创建并初始化一组系统属性。这组系统属性始终包含以下键的值 [...]

    文档说如果没有定义一组属性,则会生成一个新属性。 生成的 将始终具有文档中列出的属性。不是所有的集合都会有它们,只有那个类生成的集合。如果系统已经设置了属性,则不能保证在其中找到所有这些键。

    【讨论】:

    • 亮点是模棱两可的,因为“this set”没有明确指“新创建的”属性集或“当前”,不是吗?我想说你的解释和我的一样好。
    • @OlivierGrégoire "This" 通常指上下文中最新的可用主题。在这种情况下,它是“如果没有定义当前的系统属性集,则首先创建和初始化的属性集”,所以不,它并不模棱两可
    • 好的,我可以接受这种解释(你得到了我的 +1,我仍然需要考虑接受的答案)。无论如何,您知道我如何强制创建上述系统属性集吗?
    • @OlivierGrégoire 我真的不知道,您通常使用-D 标志添加属性,但使用java.compiler 似乎不起作用
    • @BackSlash -Djava.compiler 仅在成功实例化 java.lang.Compiler 时起作用,这取决于指定有效的 JIT 实现库。
    【解决方案2】:

    我的理解是,“java.compiler”是您设置的一个属性,用于告诉 JVM 使用特定的 JIT 编译器。如果未设置,则 JVM 使用(平台相关的)默认 JIT 编译器。

    【讨论】:

    • 您暗示java.compiler 属性是可选的。 java.lang.Compiler documentation 似乎证实了这一点:“[...] 它确定系统属性 java.compiler 是否存在。”您可能希望将其添加到您的答案中,因为它完成了它。
    • 我正在下载JDK9源代码,因为我想确认一些事情......
    【解决方案3】:

    java.compiler 属性旨在由 JVM 的调用者设置以指定 JIT 实现。

    Open JDK 在此处讨论弃用此属性: https://bugs.openjdk.java.net/browse/JDK-8041676

    API 文档: “当前供 getProperty(String) 方法使用的系统属性集作为 Properties 对象返回。”

    由于您在启动 JVM 时指定了 NONE,所以它为空。

    【讨论】:

      【解决方案4】:

      如果您使用的是 Oracle 发布的 JVM,则属性键应为 sun.management.compiler。有关 Sun 的系统属性,请参阅 this link。或者您可以通过以下命令打印虚拟机设置

      java -server -XshowSettings -version 2>&1   
      

      this post 学到后者。

      【讨论】:

        猜你喜欢
        • 2013-12-12
        • 2012-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多