我使用 Ecpise 構建了一個 jar,正確設定了主類。
當我從命令列(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
uj5u.com熱心網友回復:
如果你真的使用 Java 8 來運行它,你的 JAR 可能作業得很好......
但有證據表明,您實際上是在 Java 9 或更高版本的 JVM 中運行代碼,其中“缺失的”sun.reflect.Reflection類已移至jdk.unsupported模塊中。
最簡單的解決方案是僅在 Java 8 上運行它。或者,您將需要弄清楚該類在您的代碼庫(或依賴項)中的哪個位置sun.reflect.Reflection被使用。(看起來它在com.jidesoft.plaf代碼中。)
如果是您的代碼正在使用該類,請弄清楚如何做
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 的依賴而引起的各種問題似乎沒有任何熱情。隨著 Java 團隊關閉對這些 API 的訪問,這將越來越成問題。所以我建議:
- 開始尋找 jidesoft 代碼為您提供的功能的替代方案。
- 不要開發依賴 jide-oss 的新應用。
- 對于現有的應用程式,要么計劃重新撰寫代碼以使用替代方案,要么決定使 Java 8(而不是更高版本!)成為您的應用程式所需的平臺。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/508250.html
