我正在致力于将项目从 Java 8 升级到 Java 11。
该项目使用了一个调用
wsimport
的 ant 构建脚本,我发现该脚本已被弃用,并且不再包含在 JDK 中。 不用担心,我放心,我可以将库添加到类路径并使用新的 wsimport.sh
脚本,一切都应该没问题。
但是,事实并非如此。
该项目包含生成的代码,我们从另一个来源获取了一个 WSDL 文件。 该 WSDL 文件似乎使用
javax
导入而不是较新的 jakarta
导入。 所以,从 javax 升级到 jakarta 已经过时了。
目前,当我在 WSDL 文件上运行
wsimport.sh
时,我会看到一个充满 Java 堆栈跟踪的屏幕,其开头为:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource
Google 教授告诉我,这是因为我的类路径中没有某些版本的
activation.jar
,但我的 javax.activation.jar
目录中有一个 lib
。 打开 wsimport.sh
,我什至将 -cp ./lib/*
添加到 java
可执行调用中。 没有运气。
结果还表明我只需要“更新我的 Maven 依赖项”,这也可能是希腊语。 我认为我们没有使用 Maven。
在我对 Google 和 StackOverflow 看似详尽的搜索中,我最终被引导到这篇博文:
https://nipafx.dev/java-11-migration-guide/
...在删除 Java EE 模块的部分中,部分内容如下:
“如果你通过了编译器但忘记调整运行时,你会得到一个 NoClassDefFoundError:”
该帖子的作者所说的“调整运行时间”到底是什么意思? 我已使用
java
和 java -version
验证我使用的是 Java 11 JDK 和 java -XshowSettings:properties
可执行文件。 后者甚至显示 javax.activation.jar
已加载到类路径中。 据我所知,我没有做过任何与 JRE 相关的事情。 我需要吗?
我怀疑这可能是我的 JAXB-RI 和我的
jaxws-tools.jar
文件之间的版本不匹配,但我无法找到版本兼容性列表。
我觉得我错过了一些明显的东西,但 Java 从来都不是我的强项。 我错过了什么?
这是一个令人困惑的情况,因为旧版本的 Java 与每个 JDK/JRE 捆绑在一起,Java⇔XML 处理 API 和实现称为 Java Architecture for XML Binding。多年后,Oracle 将这些技术从 Java SE 中删除,并将它们捐赠给 Eclipse Foundation。在 Eclipse 基金会,Java Architecture for XML Binding 技术成为 Jakarta EE 的一部分,并更名为 Jakarta XML Binding(现在不鼓励使用缩写词)。
Eclipse 基金会最初使用相同的包命名发布了 Jakarta EE 的第一个版本:
javax.*
。 Jakarta EE 的所有后续版本均切换为 jakarta.*
包命名。
包命名只是问题的一部分。您还需要考虑版本,调整以下版本:
您的问题没有提供足够的细节来提供准确的解决方案。但鉴于您提供的内容:
我的 lib 目录中有一个 javax.activation.jar
…违反了上面讨论的包命名。如果您使用的是使用 jakarta.*
包命名的
Jakarta XML Binding版本,那么包括激活 JAR 在内的所有部分都应该如此。您需要找到所有部件的合适版本。