我试图针对Java 9构建一个开源项目。有一些我需要使用反射访问的文件,但我不能访问这些文件,但我不能,因为这些软件包不会被其模块导出。我使用参数--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:controlsfxcontrolsfxsrcmainjavaimplorgcontrolsfxbehaviorSnapshotViewBehavior.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:controlsfxsrcmainjavaimplorgcontrolsfxReflectionUtils.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,这可能会有所帮助。
(注意:我无法将项目进行编译,但是使用以下内容清理了一些错误(例如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'