JFoenix icon indicating copy to clipboard operation
JFoenix copied to clipboard

Getting `...does not export to module` exception after changing to non-modular project

Open jackpeters667 opened this issue 4 years ago • 10 comments

I just switched my project from modular to non modular and i'm getting this exception all of a sudden.

Exception in thread "JavaFX Application Thread" java.lang.IllegalAccessError: superclass access check failed: class com.jfoenix.controls.behavior.JFXGenericPickerBehavior (in unnamed module @0x449613ed) cannot access class com.sun.javafx.scene.control.behavior.ComboBoxBaseBehavior (in module javafx.controls) because module javafx.controls does not export com.sun.javafx.scene.control.behavior to unnamed module @0x449613ed at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at com.jfoenix.skins.JFXGenericPickerSkin.<init>(JFXGenericPickerSkin.java:62) at com.jfoenix.skins.JFXDatePickerSkin.<init>(JFXDatePickerSkin.java:60) at com.jfoenix.controls.JFXDatePicker.createDefaultSkin(JFXDatePicker.java:100) at javafx.controls/javafx.scene.control.Control.doProcessCSS(Control.java:897) at javafx.controls/javafx.scene.control.Control$1.doProcessCSS(Control.java:89) at javafx.controls/com.sun.javafx.scene.control.ControlHelper.processCSSImpl(ControlHelper.java:67) at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:145) at javafx.graphics/javafx.scene.Parent.doProcessCSS(Parent.java:1400) at javafx.graphics/javafx.scene.Parent$1.doProcessCSS(Parent.java:125) at javafx.graphics/com.sun.javafx.scene.ParentHelper.processCSSImpl(ParentHelper.java:98) at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:145) at javafx.graphics/javafx.scene.Parent.doProcessCSS(Parent.java:1400) at javafx.graphics/javafx.scene.Parent$1.doProcessCSS(Parent.java:125) at javafx.graphics/com.sun.javafx.scene.ParentHelper.processCSSImpl(ParentHelper.java:98) at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:145) at javafx.graphics/javafx.scene.Parent.doProcessCSS(Parent.java:1400) at javafx.graphics/javafx.scene.Parent$1.doProcessCSS(Parent.java:125) at javafx.graphics/com.sun.javafx.scene.ParentHelper.processCSSImpl(ParentHelper.java:98) at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:145) at javafx.graphics/javafx.scene.Parent.doProcessCSS(Parent.java:1400) at javafx.graphics/javafx.scene.Parent$1.doProcessCSS(Parent.java:125) at javafx.graphics/com.sun.javafx.scene.ParentHelper.processCSSImpl(ParentHelper.java:98) at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:145) at javafx.graphics/javafx.scene.Node.processCSS(Node.java:9542) at javafx.graphics/javafx.scene.Node.processCSS(Node.java:9535) at javafx.graphics/javafx.scene.Node.processCSS(Node.java:9535) at javafx.graphics/javafx.scene.Node.processCSS(Node.java:9535) at javafx.graphics/javafx.scene.Node.processCSS(Node.java:9535) at javafx.graphics/javafx.scene.Scene.doCSSPass(Scene.java:569) at javafx.graphics/javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2505) at javafx.graphics/com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:412) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:411) at javafx.graphics/com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:438) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:563) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:543) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:536) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:342) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277) at java.base/java.lang.Thread.run(Thread.java:834)

I'm using gradle and this is how I add my exports in my buld.gradle file applicationDefaultJvmArgs = ['--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix', '--add-exports=javafx.graphics/com.sun.javafx.scene=com.jfoenix', '--add-opens=java.base/java.lang.reflect=com.jfoenix', '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED', '--add-exports=javafx.controls/com.sun.javafx.scene.control=com.jfoenix', '--add-exports=javafx.base/com.sun.javafx.binding=com.jfoenix', '--add-exports=javafx.graphics/com.sun.javafx.stage=com.jfoenix', '--add-exports=javafx.base/com.sun.javafx.event=com.jfoenix']

Am I missing something else? It was working just fine as a modular project

jackpeters667 avatar Jul 28 '20 19:07 jackpeters667

I'm using a modular project but it still does not work and issues same error:

Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin (in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior (in module javafx.controls) because module javafx.controls does not export com.sun.javafx.scene.control.behavior to module com.jfoenix

module-info.java file:

requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.boot;
requires spring.beans;
requires com.jfoenix;
requires spring.core;
    
opens sample to spring.core;
opens sample.controller to javafx.fxml;
exports sample.controller to spring.beans;
exports sample;

I'm using a modular project but it still does not work and issues same error:

Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin (in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior (in module javafx.controls) because module javafx.controls does not export com.sun.javafx.scene.control.behavior to module com.jfoenix

module-info.java file:

requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.boot;
requires spring.beans;
requires com.jfoenix;
requires spring.core;
    
opens sample to spring.core;
opens sample.controller to javafx.fxml;
exports sample.controller to spring.beans;
exports sample;

Did you add exports? It was working just fine for me with modular, but I had to switch to non-modular because of conflicting libraries and it wasn't as easy to solve the issue, So I just opted to change, but then my JFXDatePickers dont work all of a sudden.

buttonmasher3 avatar Aug 08 '20 10:08 buttonmasher3

I'm using a modular project but it still does not work and issues same error: Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin (in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior (in module javafx.controls) because module javafx.controls does not export com.sun.javafx.scene.control.behavior to module com.jfoenix module-info.java file:

requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.boot;
requires spring.beans;
requires com.jfoenix;
requires spring.core;
    
opens sample to spring.core;
opens sample.controller to javafx.fxml;
exports sample.controller to spring.beans;
exports sample;

Did you add exports? It was working just fine for me with modular, but I had to switch to non-modular because of conflicting libraries and it wasn't as easy to solve the issue, So I just opted to change, but then my JFXDatePickers dont work all of a sudden.

I also changed it to a non-modular form then I did add --add-exports commands to the applicationDefaultJvmArgs and it worked for me. But anyway I think this is kind of dirty solution and the JFoenix core libraries should be changed to be compatible with OpenJFX +11 and its modules.

I'm using a modular project but it still does not work and issues same error: Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin (in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior (in module javafx.controls) because module javafx.controls does not export com.sun.javafx.scene.control.behavior to module com.jfoenix module-info.java file:

requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.boot;
requires spring.beans;
requires com.jfoenix;
requires spring.core;
    
opens sample to spring.core;
opens sample.controller to javafx.fxml;
exports sample.controller to spring.beans;
exports sample;

Did you add exports? It was working just fine for me with modular, but I had to switch to non-modular because of conflicting libraries and it wasn't as easy to solve the issue, So I just opted to change, but then my JFXDatePickers dont work all of a sudden.

Glad to hear that someone also has the same issue (I'm sorry XD). If you find a workaround, update me

jackpeters667 avatar Aug 08 '20 18:08 jackpeters667

@buttonmasher3 @askjgafdsdfassflsdjfljdg Could you guys share your --addexports with me? And which framework are you on? Gradle?

jackpeters667 avatar Aug 08 '20 18:08 jackpeters667

Exactly same problem here. @jfoenixadmin, it looks like a bug.

Possibly fix: just add the following row to your jvm args: "--add-opens=java.base/java.lang.reflect=com.jfoenix",

It should look like this:

def args = [ "--add-opens=java.base/java.lang.reflect=com.jfoenix", ]

run { jvmArgs = args }

Heres my complete list of VM arguments:

def args = [ "--add-exports=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED", "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED", "--add-exports=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED", "--illegal-access=warn", "--add-opens=javafx.controls/javafx.scene.control.skin=com.jfoenix", "--add-exports=javafx.controls/com.sun.javafx.scene.control=com.jfoenix", "--add-exports=javafx.base/com.sun.javafx.binding=com.jfoenix", //the next line changes everything. "--add-opens=java.base/java.lang.reflect=com.jfoenix",

    "--add-exports=javafx.controls/javafx.scene.control.skin=com.jfoenix",
    "--add-exports=java.base/java.lang.reflect=ALL-UNNAMED",
    "--add-exports=java.base/java.lang.reflect=com.jfoenix",
    "--add-exports=javafx.controls/com.Sun.javafx.scene.control.behavior=com.jfoenix",
    "--add-exports=javafx.graphics/com.sun.javafx.stage=com.jfoenix",
    "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix",

    "--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED",

    "--add-exports=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED",
    "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior" +
            "=ALL-UNNAMED",
    "--add-exports=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED",
    "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior" +
            "=com.jfoenix",
    "--add-exports=javafx.controls/com.sun.javafx.binding=com.jfoenix",
    "--illegal-access=warn",
    "--add-opens=javafx.controls/javafx.scene.control.skin=com.jfoenix",
    "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
    "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior" +
            "=com.jfoenix",
    "--add-exports=javafx.controls/com.sun.javafx.scene.control=com.jfoenix",
    "--add-exports=javafx.base/com.sun.javafx.binding=com.jfoenix",
    "--add-exports=javafx.graphics/com.sun.javafx.stage=com.jfoenix",
    "--add-exports=javafx.base/com.sun.javafx.event=com.jfoenix",

    "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix",
    "--add-exports=javafx.controls/com.sun.javafx.scene.control=com.jfoenix",
    "--add-exports=javafx.base/com.sun.javafx.binding=com.jfoenix",
    "--add-exports=javafx.graphics/com.sun.javafx.stage=com.jfoenix",
    "--add-exports=javafx.base/com.sun.javafx.event=com.jfoenix"

]

run { jvmArgs = args }

Like my answer if it helps :-)

FelipeAumannRS avatar Apr 28 '21 13:04 FelipeAumannRS

All that junk looked disgusting to me so and I don't like copy-pasting tons of crap without at least knowing it's required, so I was able to narrow down what I needed down to this for a non-modular project (in my case at least):

run { jvmArgs = [ "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED", "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED", "--add-exports=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED", "--add-exports=javafx.base/com.sun.javafx.binding=ALL-UNNAMED", "--add-exports=javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED", "--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED" ] }

It's not hard to check the error output and add what you need one by one once you've got the syntax as demonstrated above. I am a little surprised I didn't need to export anything at all to com.jfoenix, but I can't argue with "works on my machine".

Maybe the list can vary depending on your specific case. But this works for me with Java 17.0.1 (fx-zulu VM) and Gradle 7.3.2.

louhy avatar Dec 19 '21 21:12 louhy

Please take a look at my article that explain how to export all modules to all modules at runtime in Java 16 and later without using any JVM parameter.

JJBRT avatar Dec 23 '21 13:12 JJBRT

Interesting alternative above. I probably won't go that route in my case but good to know there's other choices.

louhy avatar Dec 28 '21 20:12 louhy

module javaFxException { requires javafx.controls; requires javafx.fxml;

opens application to javafx.graphics, javafx.fxml;
opens gui to javafx.graphics, javafx.fxml;

}

Maslow5941 avatar Sep 24 '22 16:09 Maslow5941