首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.lang.NoClassDefFoundError:从jar运行时的sun/reflect/反射

java.lang.NoClassDefFoundError:从jar运行时的sun/reflect/反射
EN

Stack Overflow用户
提问于 2022-09-01 11:22:28
回答 1查看 289关注 0票数 0

我使用Ecplise构建了一个jar,正确地设置了主类。

当我从命令行(Windows)运行"java -Xms512m -Xmx1024m -jar foo.jar config.ini“时,我会得到以下异常

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-01 15:42:07

如果您真的使用Java 8来运行它,您的JAR可能会运行得很好.

但是有证据表明,您实际上是在Java9或更高版本的JVM中运行代码,其中“缺失”的sun.reflect.Reflection类已经移到了jdk.unsupported模块中。

最简单的解决方案是只在Java 8上运行这个程序。或者,您需要找出在您的代码库(或依赖项)中使用sun.reflect.Reflection类的位置。(看起来像是在com.jidesoft.plaf代码中。)

  • 如果使用类的是您的代码,那么就找出如何做Reflection正在做的事情.而不依赖内部API。
  • 如果是依赖项,请查找支持Java 9及更高版本的依赖项的更新版本。

这可能有助于您解决jidesoft代码中(显然)的jidesoft兼容性问题。

  • 看起来您可能正在使用JIDE公共层。在GitHub上有jidesoft/jide-oss的版本
  • 回购程序中有一个名为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 java.桌面/sun.sw.wing=ALL--未命名--add java.桌面/sun.awt=ALL-添加-java.desktop/javax.swing.plaf.synth=ALL-UNNAMED/sun.awt.Image=ALL未命名--添加-导出java.桌面/sun.awt.windows=所有-未命名--添加-导出java.base/sun.security.action=所有未命名的从类路径中删除xerces.jar 这些似乎是关于如何使用Java 9或更高版本上的依赖项的说明。
  • 在repo中,似乎也有Java 8和Java 9源代码的版本。

恐怕,我无法告诉您如何构建和运行Java 9版本的代码。如果您很难理解,我的建议是在Java 8上运行您的应用程序。

最后,jide问题跟踪器中有一些东西表明,这段代码不太可能在未来得到更多的“爱”。特别是,对于解决代码库对JDK内部API的依赖所引起的各种问题,人们似乎没有任何热情。随着Java团队关闭对这些API的访问,这将越来越成问题。因此,我建议:

  • 开始寻找jidesoft代码为您提供的功能的替代方案。
  • 不要开发依赖于jide的新应用程序。
  • 对于现有的应用程序,要么计划重新工作代码以使用替代方案,要么决心使Java 8(而不是更高的!)应用程序所需的平台。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73568533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档