ClassNotFoundException 包含在 exe 文件中的类

问题描述

我有一个 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”。