问题描述
我有一个 javafx 11 应用程序的问题。 由于 ClassNotFoundExceptions,我每天都可以在日志文件中看到一些 NoClassDefFoundError。 此异常可能发生在不同的类上。 这些类可以是内部类,也可以来自我正在使用的外部库。 这些类存在于我的 exe 文件中(如果我打开存档,我可以看到它)并且在大多数情况下这个类是可用的,但是,我不知道为什么,有时会抛出这个异常。
这就是我打包我的应用程序的方式:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>1.3.56</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>1.3.56</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>1.3.56</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>1.3.56</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.56</version>
<configuration>
<mainClass>mypackage.MyMain</mainClass>
<arguments>
<argument>-db</argument>
<argument>dbURL</argument>
</arguments>
<systemProperties>
<systemProperty>
<key>java.security.manager</key>
</systemProperty>
<systemProperty>
<key>java.security.policy</key>
<value>$MODULE_DIR$/src/main/resources/client.policy</value>
</systemProperty>
<systemProperty>
<key>prism.order</key>
<value>j2d</value>
</systemProperty>
</systemProperties>
</configuration>
</plugin>
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.7.25</version>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<jar>${basedir}/target/${project.artifactId}-${project.version}-jar-with-dependencies.jar</jar>
<outfile>${basedir}/target/App.exe</outfile>
<downloadUrl>http://java.com/download</downloadUrl>
<classpath>
<mainClass>mypackage.MyMain</mainClass>
</classpath>
<icon>${basedir}/src/main/resources/images/myIcon.ico</icon>
<jre>
<path>${jdk.path}</path>
<bundledJre64Bit>true</bundledJre64Bit>
<bundledJreAsFallback>true</bundledJreAsFallback>
<minVersion>11</minVersion>
<jdkPreference>preferJre</jdkPreference>
<runtimeBits>32</runtimeBits>
<opts>
<opt>-Xmx768M -Djava.security.policy==#/client.policy</opt>
<opt>-Djava.rmi.server.useCodebaSEOnly=false</opt>
<opt>--module-path="myPath\Amazon Corretto\jdk11.0.5_10\javafx-sdk-11.0.2\lib"</opt>
<opt>--add-modules=javafx.base,javafx.controls,javafx.graphics</opt>
<opt>Lot of opt like that</opt>
</opts>
</jre>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这是个例外:
ERROR myPackage.jfx.gui.MyClass - java.lang.NoClassDefFoundError: myPackage/jfx/gui/misc/ClipboardHelper
at myPackage.jfx.gui.MyClass.getContent(MyClass.java:132)
at myPackage.app.client.ui.controls.EnhancedMyClass.getContent(EnhancedMyClass.java:149)
at myPackage.jfx.gui.MyClassSkin.setupDragDropContent(MyClassSkin.java:433)
at myPackage.jfx.gui.MyClassSkin$4.handle(MyClassSkin.java:139)
at myPackage.jfx.gui.MyClassSkin$4.handle(MyClassSkin.java:131)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventdispatcher.dispatchBubblingEvent(CompositeEventdispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventdispatcher.dispatchEvent(BasicEventdispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventdispatchChainImpl.dispatchEvent(EventdispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Scene$DnDGesture.fireEvent(Scene.java:3027)
at javafx.graphics/javafx.scene.Scene$DnDGesture.process(Scene.java:3106)
at javafx.graphics/javafx.scene.Scene$DnDGesture.access$8300(Scene.java:3003)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3867)
at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.classNotFoundException: myPackage.jfx.gui.misc.ClipboardHelper
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.classLoader.loadClass(ClassLoader.java:521)
... 51 more
有什么问题吗? 如果我的类包含在我的 .exe 文件中,我怎么会出现 ClassNotFoundException。
有时此问题对用户(后台任务)不可见,具体取决于课程。但是当出现异常时,用户可以重新启动应用程序并且一切正常。 时间或睡眠模式对 javafx 应用有影响吗?
非常感谢!
解决方法
NoClassDefFoundError
应该意味着,如 commented here,您的 myPackage.jfx.gui.misc.ClipboardHelper
模块未放置在模块路径或类路径中。
确保模块实际上通过模块描述符中的 requires 指令解析为模块,或者如果您的代码不是模块化的,则使用 --add-modules
参数
仔细检查您的runtime arguments:
--module-path C:\Users<user>\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls
您可以完成它们以引用您自己的模块。
如本问题所述:“--add-modules
necessary for modules which are on the module path”。