如何在JDK 12上运行Apache CXF的wadl2java?

4

以下命令曾经完美运行:

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.

你能否提供一些关于如何解决这个问题的技巧?


1
Java SE 8更新中,认可的标准覆盖机制已被弃用,并在Java SE 9中删除。我不了解Apache XCF,但他们是否有适用于JDK 9及更高版本的版本? - Alan Bateman
1
我对Apache CXF一无所知,但网页上说“CXF将在下一个3.3.x版本中支持Java 9-11”。您问题中的文件路径表明您正在使用3.1.6。无论如何,自JDK 9以来,认可标准覆盖机制已被删除。 - Alan Bateman
@AlanBateman对不起,3.1.6是笔误。我本来使用的是3.3.1版本。我刚刚已经进行了更正。 - Hong
@AlanBateman,我不是CXF的专家。 wsdl2java是我偶尔使用的CXF中唯一的东西。这就是为什么我在这里提出问题的原因。非常感谢您的帮助。 - Hong
我安装了Java 8,现在apache-cxf-3.3.1可以完美地与之配合工作。这对我来说是最简单和最快速的解决方案,直到Apache CFX团队中的某个人为此提供更多信息。 - Hong
显示剩余5条评论
1个回答

5
我成功地使Apache CXF 3.3.1的wsdl2java工具与最新的OpenJDK 11一起使用,这是我做的4件事:
  1. 下载https://mvnrepository.com/artifact/javax.jws/jsr181-api/1.0-MR1并将其放入{CXF_HOME}/lib目录。
  2. 下载https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api/2.3.1并将其放入{CXF_HOME}/lib目录。
  3. 在我的情况下,由于我在Mac上运行,我修改了wsdl2java脚本,并确保在执行java命令之前,在脚本中显式设置了这两个jar文件的CXF类路径,如下所示: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+支持问题。
如果您的需求不同,我建议至少删除“-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机器上测试过你的答案是否可行,但我已经接受了你的答案。 - Hong
我简直不敢相信我找到了这个答案。 - geochr
当然,这将执行代码生成,但是您生成的代码将无法在Java 11+中编译,因为像javax.xml.bind.annotation这样的包已被删除。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接