繁体   English   中英

java.lang.NoClassDefFoundError: sun/reflect/Reflection while running from jar

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM