如何 运行 Apache CXF wadl2java 与 JDK 12?

How to run Apache CXF wadl2java with JDK 12?

以下命令曾经完美运行:

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.

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

我通过做 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. 在我的例子中,因为我在 Mac 上 运行,我 vi'd wsdl2java 脚本并确保这两个罐子是通过在执行 java 命令之前在脚本中执行以下声明,明确设置在 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"' 参数脚本结束,因为更新的 JDKs 不再支持这个参数,所以我的命令现在看起来像这样:$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 参数之间显然有一些问题仍在传递实用程序和缺少的库以支持较新的 JDKs,其中这些遗留库已被删除。

希望这能帮助那些不幸的人,他们仍然在针对 SOAP 端点进行编程,但至少要努力使您正在编写的客户端代码保持最新,并利用现代 JDK.