【问题标题】:Migrating Swing application to Java 8 causes java.lang.ClassNotFoundException: org.jdesktop.swingworker.SwingWorker将 Swing 应用程序迁移到 Java 8 会导致 java.lang.ClassNotFoundException: org.jdesktop.swingworker.SwingWorker
【发布时间】:2021-11-15 01:14:23
【问题描述】:

将在 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 上也能正常工作。

【问题讨论】:

  • SwingWorker 是基础 JDK (javax.swing.SwingWorker) 的一个类。不确定您的应用程序以前是否使用过该类的第 3 方版本。我会尝试摆脱自定义类。请参阅:Worker Thread and SwingWorker(docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) 了解更多信息。
  • 我想,org.jdesktop.swingworker.SwingWorker 应该包含在libs/swing-worker-1.1.jar 中。所以你必须检查这个资源是否有问题。
  • 由于您现在缺少一个不同的 JAR,请考虑提出一个新问题。您可以点击左侧的empty check mark 接受有关此问题的答案。

标签: java swing java-8 weblogic12c jnlp


【解决方案1】:

根据 Wikipedia,org.jdesktop.swingworker.SwingWorker 是 Java 6 中引入的 javax.swing.SwingWorker 类的反向移植。

SwingWorkerWikipedia page 声明:

Java 6 SwingWorker 到 Java 5 的反向移植可在 http://swingworker.java.net/[永久死链接] 获得。除了包名(org.jdesktop.swingworker)外,它还兼容Java 6 SwingWorker

java.net 上此包的原始主页已消失。 (但你可能对 Wayback Machine archive 有一些运气。)

我在 Maven Central 上找到了几个条目,但其中一个也处于离线状态。


所以,看起来有两种选择:

  1. 到目前为止,最好的选择是修改您的项目以使用官方javax.swing.SwingWorker。这应该是一个简单的改变。只需更改 import 语句即可。一旦你这样做了,你就可以永远忘记这个问题。

  2. 如果您仍然需要在 Java 5 和更早版本上支持您的应用程序,那么您需要为此依赖项找到一个 JAR 文件并将其添加到您的项目中。试试 Maven Central。


有关其他org.jdesktop.* 依赖项的信息,请参阅Eclipse does not recognize org.jdesktop.* 的答案。

【讨论】:

  • 另见archive;选项一在 Java 11 下工作,通过将包私有访问替换为 import javax.swing.SwingWorker;
  • "... 通过替换包私有访问..." - 不太清楚你的意思。旧的 org.jdesktop.swingworker.SpringWorker 类是 / 是 public。尽管是第 3 方课程。
  • 大家好,我已经尝试了所有可能的方法来使其与 JDK 8 兼容,但仍然遇到相同的错误。 org.jdesktop.swingworker.SwingWorker 是 swing-worker-1.1.jar 下的第三方类
  • 也许 swingx 取决于 SwingWorker。据我所知,这是一个子项目:en.wikipedia.org/wiki/SwingLabs。如您所见,SwingLabs 已经过时了 10 年......并且与org.jdesktop.swingworker 处于相同的情况。基本废了。您可能应该尝试删除该依赖项并(在必要时)将其替换为 javax.swing 类。 (移植不再受支持的具有依赖关系的古老代码并不是一件简单的事情。它可能需要大量的 Java 开发工作。)
  • 所有依赖资源都需要在服务器的适当位置,以便在需要时可以下载。你检查过吗?您是否检查了服务器端日志以查看客户端正在获取哪些文件以查看是否正在请求 JAR ......以及服务器响应是什么?
【解决方案2】:

herehere 所示,org.jdesktop.swingworker 是 Java 5 的SwingWorker 的后向端口。代码保留在herehere

应该可以去掉依赖:

<jar href="libs/swing-worker-1.1.jar"/>

并导入标准实现:

import javax.swing.SwingWorker;

作为一个具体示例,PrimeNumbersDemo 通过删除 package 声明并添加 import 在 Java 8 和 11 下独立编译和运行。

 //package org.jdesktop.swingworker;
 import javax.swing.SwingWorker;

顺便说一句,package 声明的作用是让演示 package-private 在没有明确的 import 的情况下访问 SwingWorker 类。

【讨论】:

  • 知道为什么在通过 JNLP 调用应用程序并抛出 ClassNotFoundExp 时没有加载 JAR 吗?
  • 哪个 JAR:包含 org/jdesktop/swingworker/SwingWorker 的 JAR 或包含 javax.swing.SwingWorker 的 JAR?也许this 可能会有所启发。
  • 包含 org/jdesktop/swingworker/SwingWorker 的 JAR。我已经用 Java SwingWorker 替换了它,原因是:java.lang.ClassNotFoundException: org.jdesktop.swingworker.SwingWorker 现在已经消失了,但是在项目中,我们还有其他几个 JAR 没有加载和抛出 java.lang.ClassNotFoundException。附言相同的构建在 weblogic 12c 服务器上使用 JDK 6 可以正常工作/运行,问题仅出在 JDK 8 上。
猜你喜欢
  • 2019-09-20
  • 2019-01-24
  • 2016-08-25
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
相关资源
最近更新 更多