Java9: 导出包到未命名模块失败

Java 9: Exporting packages to unnamed modules fail

我正在尝试针对 Java 9 构建 an open-source project。有些文件我需要使用反射访问,但我不能,因为这些包不是由它们的模块导出的。我使用参数 --add-exports.

将包导出到未命名的模块

我已将以下参数添加到环境变量 _JAVA_OPTIONS:

-Dsun.reflect.debugModuleAccessChecks=true 
--add-exports=javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED
--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED

我正在使用最新的 JDK 9 版本(截至今天):

C:\controlsfx>java -version
java version "9"
Java(TM) SE Runtime Environment (build 9+175)
Java HotSpot(TM) 64-Bit Server VM (build 9+175, mixed mode)

这是我尝试构建项目时的输出:

C:\controlsfx>.\gradlew :controlsfx:build
Picked up _JAVA_OPTIONS: -Dsun.reflect.debugModuleAccessChecks=true --add-exports=javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED --add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
:controlsfx:compileJava
C:\controlsfx\controlsfx\src\main\java\impl\org\controlsfx\behavior\SnapshotViewBehavior.java:60: error: package com.sun.javafx.scene.control.behavior is not visible
import com.sun.javafx.scene.control.behavior.BehaviorBase;
                                   ^
  (package com.sun.javafx.scene.control.behavior is declared in module javafx.controls, which does not export it to the unnamed module)

C:\controlsfx\src\main\java\impl\org\controlsfx\ReflectionUtils.java:3: error: package com.sun.javafx.scene.traversal is not visible
import com.sun.javafx.scene.traversal.ParentTraversalEngine;
                           ^
  (package com.sun.javafx.scene.traversal is declared in module javafx.graphics, which does not export it to the unnamed module)

编译还是失败,我想知道我哪里做错了。

您添加的标志(似乎是正确的)似乎没有添加到编译器中,而是添加到运行 Gradle 的进程中。一个迹象是通知您有关 --illegal-access 的消息,它仅在 java 上可用,而不是 javac

使用 Java 9 时,有时很难将参数放在正确的位置。对于 Gradle this might help.

(注意:我无法让项目编译,但一些有问题的错误(例如 BehaviorBase)已通过以下内容清除。)

使用 jdk 9 b175 和 Gradle 4.1-milestone-1:

compileJava {
    options.encoding = "UTF-8"
    options.incremental = true

    options.compilerArgs.addAll([
        "--add-exports",
        "javafx.base/com.sun.javafx.event=ALL-UNNAMED"
    ])  
    options.compilerArgs.addAll([
        "--add-exports",
        "javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED"
    ])  
    options.compilerArgs.addAll([
        "--add-exports",
        "javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED"
    ])  
}

sourceCompatibility = '9'
targetCompatibility = '9'