我通过做 4 件事让 Apache CXF 3.3.1 wsdl2java 实用程序与最新的 OpenJDK 11 一起工作:
- 拉下这个jar,放到{CXF_HOME}/lib目录下:https ://mvnrepository.com/artifact/javax.jws/jsr181-api/1.0-MR1
- 拉下这个 jar 并将其放在 {CXF_HOME}/lib 目录中:https ://mvnrepository.com/artifact/javax.xml.ws/jaxws-api/2.3.1
就我而言,因为我在 Mac 上运行,所以我使用了 wsdl2java 脚本,并确保这两个 jar 被明确设置在 CXF 类路径上,方法是在执行 java 之前在脚本中执行以下声明命令:cxf_classpath=${cxf_classpath}:../lib/jaxws-api-2.3.1.jar:../lib/jsr181-api-1.0-MR1.jar
最后,我从脚本末尾的 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 服务而言,这一切是否仍然有效是待定的,但我现在至少已经克服了这个专门用于从 WSDL 生成客户端代码的工具的 Java9+ 支持问题.
如果您的需求不同,我至少会删除 '-Djava.endorsed.dirs="${cxf_home}/lib/endorsed"' JVM 参数并使用您需要设置的参数开始调用 wsd2java 命令并开始迭代添加回到丢失的库中,它开始抛出 java.lang.NoClassDefFoundError 错误。
他们的常见问题解答特别指出,从 3.3.x 开始,将支持 Java 9+,但在实用程序中仍传递的不再受支持的硬编码 JVM 参数和缺少库以支持这些遗留的较新 JDK 之间显然有些问题库已被删除。
希望这可以帮助那些不幸的人仍然在针对 SOAP 端点进行编程,但至少要尝试使您正在编写的客户端代码保持最新并利用现代 JDK 的新功能。