将 JDK 6 上开发的 Swing 应用程序迁移到 JDK 8 时遇到问题,导致出现以下问题:
java.lang.NoClassDefFoundError: org/jdesktop/swingworker/SwingWorker
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.jdesktop.swingworker.SwingWorker
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at com.sun.jnlp.JNLPClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 8 more
应用程序正在使用 JNLP 作为依赖项。
JNLP配置:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.6+" codebase="http://SERVER_NAME:8080/jnlp/" href="test.jnlp">
<information>
<title>Test</title>
<vendor>ABC</vendor>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<update check="always" policy="always" />
<resources>
<j2se version="1.6*" max-heap-size="512M" initial-heap-size="256m" href="http://java.sun.com/products/autodl/j2se" />
<property name="weblogic.MaxMessageSize" value="2000000000"/>
<!-- Environment -->
<property name="env" value="test"/>
<!-- SSO authentication parameters for DEBUGGING -->
<property name="abc.xyx.debug" value="true"/>
<property name="aaaa.rrrr.debug" value="true"/>
<property name="tttt.rrrr.eee.enable" value="true"/>
<jar href="libs/test-SNAPSHOT.jar" main="true"/>
..........SOME OTHER JAR's
<jar href="libs/swingx-0.9.5.jar"/>
<jar href="libs/swing-worker-1.1.jar"/>
</resources>
<resources os="Windows" arch="x86">
<nativelib href="libs/XYZ-1.0.jar"/>
</resources>
<application-desc main-class="com.example.Login" />
</jnlp>
任何人都可以对此提供帮助,或者建议 JDK 8 中有关 JNLP 和 Java Web Start 的更改/改进。
使用的技术堆栈:Java 8、Web Logic 12c
提前致谢:)
更新1:
仅对于 RnD,在 JDK 6 上使用相同的 JNLP 配置执行相同的构建,它工作正常,但当我尝试在 JDK 8 上运行时,出现以下错误:
当我从 eclipse 运行该应用程序时,它在 JAVA 8 上也运行良好。
最佳答案
根据 Wikipedia,org.jdesktop.swingworker.SwingWorker
是 Java 6 中引入的 javax.swing.SwingWorker
类的向后移植。
Wikipedia page SwingWorker
指出:
A backport of the Java 6
SwingWorker
to Java 5 is available athttp://swingworker.java.net/
[permanent dead link]. Apart from the package name (org.jdesktop.swingworker
), it is compatible with the Java 6SwingWorker
.
这个包在 java.net
上的原始主页已经消失了。 (但是您可能会在 Wayback Machine archive 上有一些运气。)
我在 Maven Central 上找到了几个条目,但其中一个也处于离线状态。
所以,看起来有两个选择:
到目前为止,最好的选择是修改您的项目以使用官方
javax.swing.SwingWorker
。这应该是一个简单的改变。只需更改import
语句即可。一旦完成此操作,您就可以永远忘记这个问题。如果您仍然需要在 Java 5 及更早版本上支持您的应用程序,那么您需要找到此依赖项的 JAR 文件并将其添加到您的项目中。尝试 Maven Central。
有关其他 org.jdesktop.*
依赖项的信息,请参阅 Eclipse does not recognize org.jdesktop.* 的答案.
关于java - 将 Swing 应用程序迁移到 Java 8 会导致 java.lang.ClassNotFoundException : org. jdesktop.swingworker.SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69269501/