Gradle如何使用`--add-exports`命令

7

我因为在Java >9中使用了com.sun.*类而遇到了java.lang.IllegalAccessError错误。解决此问题的方法是添加--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']
}

我尝试加入它,但没有帮助。 这个 就是我的问题。错误信息如下:

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) [?:?]
1个回答

14

看起来你没有一个模块化项目。有两个解决方案:

  • 创建一个模块化项目

如果你添加了一个 module-info 描述符,例如:

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

    exports org.openjfx;
}

(当然要添加你的模块),它可以与以下内容一起使用:

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

由于您的项目不是模块化的,它属于所谓的未命名模块。因此,您应该使用ALL-UNNAMED,这样包就会导出到所有模块,包括 ControlsFX:

run {
    jvmArgs = ['--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED']
}

我遇到了相同的错误,指的是java.net.http未导出jdk.internal.net.http.common。我已经添加了 run { jvmArgs = ['--add-exports=java.net.http/jdk.internal.net.http=ALL-UNNAMED'] } 但仍然遇到相同的错误。请问我做错了什么? - Hasti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接