Gradle 使用 `--add-exports` 运行

pie*_*mes 4 java javafx controlsfx

java.lang.IllegalAccessError因为com.sun.*在 Java > 9中使用了一个类,所以我得到了一个。解决这个问题的方法是添加--add-exports=javafx.base/com.sun.javafx.event=org.controlsfx.controls. 我不知道如何将它添加到我的build.gradle,但我把

run {
    jvmArgs = ['--add-exports=javafx.base/com.sun.javafx.event=org.controlsfx.controls']
}
Run Code Online (Sandbox Code Playgroud)

进入它并没有帮助。几乎是我遇到的问题。错误信息是:

java.lang.IllegalAccessError: class org.controlsfx.control.textfield.AutoCompletionBinding (in unnamed module @0x2d7444bc) cannot access class com.sun.javafx.event.EventHandlerManager (in module javafx.base) because module javafx.base does not export com.sun.javafx.event to unnamed module @0x2d7444bc
    at org.controlsfx.control.textfield.AutoCompletionBinding.<init>(AutoCompletionBinding.java:522) ~[controlsfx-11.0.0.jar:11.0.0]
    at impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding.<init>(AutoCompletionTextFieldBinding.java:107) ~[controlsfx-11.0.0.jar:11.0.0]
    at org.controlsfx.control.textfield.TextFields.bindAutoCompletion(TextFields.java:151) ~[controlsfx-11.0.0.jar:11.0.0]
[…]
    at java.lang.Thread.run(Thread.java:835) [?:?]
Run Code Online (Sandbox Code Playgroud)

Jos*_*eda 7

看起来您没有模块化项目。有两个选项可以解决它:

  • 做一个模块化项目

如果添加模块信息描述符,例如:

module hellofx {
    requires javafx.controls;
    requires org.controlsfx.controls;

    exports org.openjfx;
}
Run Code Online (Sandbox Code Playgroud)

(当然,在那里添加您的模块),它将适用于:

run {
    jvmArgs = ['--add-exports= \
                javafx.base/com.sun.javafx.event=org.controlsfx.controls']
}
Run Code Online (Sandbox Code Playgroud)
  • 导出到所有模块

由于您的项目不是模块化的,它是所谓的未命名模块的一部分。因此,您应该使用ALL-UNNAMED,以便将包导出到所有模块,包括 ControlsFX:

run {
    jvmArgs = ['--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED']
}
Run Code Online (Sandbox Code Playgroud)