[英]java.lang.NoClassDefFoundError: sun/reflect/Reflection while running from jar
我使用 Ecplise 构建了 jar,正确设置了主 class。
当我从命令行(Windows)运行“java -Xms512m -Xmx1024m -jar foo.jar config.ini”时,出现以下异常
Exception in thread "main" java.lang.NoClassDefFoundError: sun/reflect/Reflection
at com.jidesoft.plaf.UIDefaultsLookup.getCallerClassLoader(Unknown Source)
at com.jidesoft.plaf.UIDefaultsLookup.get(Unknown Source)
at com.jidesoft.plaf.vsnet.VsnetWindowsUtils.initComponentDefaultsWithMenu(Unknown Source)
at com.jidesoft.plaf.LookAndFeelFactory.installJideExtension(Unknown Source)
at com.jidesoft.plaf.LookAndFeelFactory.installJideExtension(Unknown Source)
at com.jidesoft.plaf.LookAndFeelFactory.installJideExtension(Unknown Source)
at com.jidesoft.swing.JideButton.updateUI(Unknown Source)
at java.desktop/javax.swing.AbstractButton.init(AbstractButton.java:2136)
at java.desktop/javax.swing.JButton.<init>(JButton.java:131)
at java.desktop/javax.swing.JButton.<init>(JButton.java:85)
at com.jidesoft.swing.JideButton.<init>(Unknown Source)
at com.jidesoft.swing.JideButton.<init>(Unknown Source)
at ro.sync.ui.application.lb.<init>(Unknown Source)
at ro.sync.exml.m.d.<init>(Unknown Source)
at ro.sync.exml.m.d.dqe(Unknown Source)
at ro.sync.exml.m.c.<init>(Unknown Source)
at ro.sync.ecss.extensions.api.component.AuthorComponentFactory$2.<init>(Unknown Source)
at ro.sync.ecss.extensions.api.component.AuthorComponentFactory.init(Unknown Source)
at ro.sync.ecss.extensions.api.component.AuthorComponentFactory.init(Unknown Source)
at ro.sync.ecss.samples.AuthorComponentSample.<init>(AuthorComponentSample.java:311)
at ro.sync.ecss.samples.AuthorComponentSample.main(AuthorComponentSample.java:545)
Caused by: java.lang.ClassNotFoundException: sun.reflect.Reflection
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 21 more
如果您真的使用 Java 8 来运行它,那么您的 JAR 可能会工作得很好......
但有证据表明,您实际上是在 Java 9 或更高版本 JVM 中运行代码,其中“丢失的” sun.reflect.Reflection
jdk.unsupported
模块已被移动。
最简单的解决方案是仅在 Java 8 上运行它。 或者,您需要确定在您的代码库(或依赖项)中使用sun.reflect.Reflection
class 的位置。 (看起来它在com.jidesoft.plaf
代码中。)
如果使用 class 的是您的代码,请弄清楚如何执行Reflection
正在执行的操作……而不依赖于内部 API。
如果是依赖项,请查找支持 Java 9 及更高版本的依赖项的较新版本。
这可以帮助您解决 jidesoft 代码中的(明显的)Java 9+ 兼容性问题。
看起来您可能正在使用 JIDE 公共层。 在jidesoft/jide-oss的 GitHub 上有这个版本
repo 中有一个名为README JDK9.txt的文件。 它说:
--add-exports java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED --add-exports java.desktop/javax.swing.plaf.synth=ALL-UNNAMED --add-exports java.desktop/sun.swing=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.desktop/sun.awt.image=ALL-UNNAMED --add-exports java.desktop/sun.awt.shell=ALL-UNNAMED --add-exports java.desktop/sun.awt.dnd=ALL-UNNAMED --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED --add-exports java.base/sun.security.action=ALL-UNNAMED Remove xerces.jar from the classpath
这些似乎是有关如何使用对 Java 9 或更高版本的依赖项的说明。
在 repo 中似乎还有 Java 8 和 Java 9 的源代码版本。
恐怕,我无法告诉你如何构建和运行 Java 9 版本的代码。 如果您很难弄清楚,我的建议是在 Java 8 上运行您的应用程序。
最后,jide-oss 问题跟踪器中的一些内容表明,该代码在未来不太可能获得太多“爱”。 对于解决代码库依赖 JDK 内部 API 引起的各种问题,似乎没有任何热情。 所以我建议不要构建依赖 jide-oss 的新应用程序。 寻找替代品。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.