【问题标题】:How to run Apache CXF wadl2java with JDK 12?如何使用 JDK 12 运行 Apache CXF wadl2java?
【发布时间】:2019-04-02 21:59:33
【问题描述】:

以下命令曾经完美运行:

C:\tools\apache-cxf-3.3.1\bin\wsdl2java -client -d generated foo.wsdl

它不再适用于最新版本的 JDK - 12。我已经下载了最新版本的 Apache CXF,但仍然遇到同样的错误:

-Djava.endorsed.dirs=C:\tools\apache-cxf-3.3.1\bin\..\lib\endorsed is not supported. Endorsed standards and standalone APIs
in modular form will be supported via the concept of upgradeable modules.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

任何人都可以提供有关如何解决此问题的提示吗?

【问题讨论】:

  • 认可的标准覆盖机制在 Java SE 8 更新中已被弃用,并在 Java SE 9 中被删除。我对 Apache XCF 一无所知,但他们有在 JDK 9 和更新版本上运行的版本吗?
  • @AlanBateman 根据他们的常见问题解答,它支持 Java 9+ cxf.apache.org/faq.html#FAQ-CanCXFrunwithJDK/Java9+(10,11)?
  • 我不知道任何关于 Apache CXF 的信息,但该网页显示“CXF 将在下一个 3.3.x 版本中支持 Java 9-11”。您问题中的文件路径表明您使用的是 3.1.6。在任何情况下,自 JDK 9 以来已经删除了认可的标准覆盖机制。
  • @AlanBateman 很抱歉,3.1.6 是一个错字。我使用的是 3.3.1。我刚刚更正了它。
  • @AlanBateman 我不是 CXF 专家。 wsdl2java 是我偶尔使用的唯一 CXF 东西。这就是我在这里问这个问题的原因。非常感谢您提供帮助。

标签: cxf wsdl2java java-12


【解决方案1】:

我通过做 4 件事让 Apache CXF 3.3.1 wsdl2java 实用程序与最新的 OpenJDK 11 一起工作:

  1. 拉下这个jar,放到{CXF_HOME}/lib目录:https://mvnrepository.com/artifact/javax.jws/jsr181-api/1.0-MR1
  2. 拉下这个 jar 并将其放在 {CXF_HOME}/lib 目录中:https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api/2.3.1
  3. 1234563 java命令执行前:cxf_classpath=${cxf_classpath}:../lib/jaxws-api-2.3.1.jar:../lib/jsr181-api-1.0-MR1.jar
  4. 最后,我从脚本末尾的 java 命令中删除了 '-Djava.endorsed.dirs="${cxf_home}/lib/endorsed"' 参数,因为较新的 JDK 不再支持此参数,所以我的命令现在看起来像这样:$JAVA_HOME/bin/java -Xmx${JAVA_MAX_MEM} -cp "${cxf_classpath}" -Djava.util.logging.config.file=$log_config org.apache.cxf.tools.wsdlto.WSDLToJava "$@"

现在,使用 OpenJDK11,我可以指向外部 WSDL 文件并成功生成我需要使用以下命令使用此 SOAP 服务的客户端代码:

./wsdl2java -client -d src https://somewhere.com/service\?wsdl

就能否调用和使用我正在编写的 SOAP 服务而言,这一切是否有效尚待定,但我至少现在已经克服了使用这个专门用于生成客户端代码的工具的 Java9+ 支持问题来自 WSDL。

如果您的需求不同,我至少会删除 '-Djava.endorsed.dirs="${cxf_home}/lib/endorsed"' JVM 参数并使用您需要设置的参数开始调用 wsd2java 命令开始迭代地添加回丢失的库,它开始抛出 java.lang.NoClassDefFoundError 错误。

他们的常见问题解答明确指出,从 3.3.x 开始,将支持 Java 9+,但在实用程序中仍传递不再受支持的硬编码 JVM 参数与支持较新 JDK 的缺少库之间显然有些问题这些旧版库已被删除。

希望这可以帮助那些不幸的人仍然在针对 SOAP 端点进行编程,但至少要尝试使您正在编写的客户端代码保持最新并利用​​现代 JDK 的新功能。

【讨论】:

  • 感谢您的回答。我正在使用 Windows。对我来说,使用 Java 8 来解决这个问题要容易得多。我还没有测试过你的答案可能也适用于 Windows 机器,但我接受了你的答案。
  • 我不敢相信我找到了答案。
  • 当然这将执行代码生成,但您生成的代码将无法使用 Java 11+ 编译,因为 javax.xml.bind.annotation 等包已被删除。
猜你喜欢
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多