代理环境下Wsdl2java执行报错:WSDLException: faultCode=PARSER_ERROR
代理环境下Maven CXF插件Wsdl2java无法访问WSDL的解决方案
我来帮你搞定这个代理环境下CXF插件访问WSDL的问题,这类坑我之前也踩过,通常是插件没正确读取Maven的代理配置,或者需要单独给它指定参数。下面是几个靠谱的解决办法:
1. 让CXF插件继承Maven全局代理配置
首先确保你的settings.xml(通常在~/.m2/或Maven安装目录的conf/文件夹下)已经配置了正确的代理信息:
<settings> <proxies> <proxy> <id>work-proxy</id> <active>true</active> <protocol>http</protocol> <host>your-proxy-host.com</host> <port>8080</port> <nonProxyHosts>localhost|*.your-internal-domain.com</nonProxyHosts> <!-- 若代理需要认证,添加以下两行 --> <!-- <username>your-proxy-username</username> --> <!-- <password>your-proxy-password</password> --> </proxy> </proxies> </settings>
然后在CXF插件的配置里添加<useMavenProxy>true</useMavenProxy>,强制插件使用Maven的全局代理设置:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.6.2</version> <!-- 替换成你实际使用的版本 --> <executions> <execution> <id>generate-wsdl-sources</id> <phase>generate-sources</phase> <goals> <goal>wsdl2java</goal> </goals> <configuration> <wsdlOptions> <wsdlOption> <wsdl>http://your-service-host.com/service?wsdl</wsdl> <!-- 关键:启用Maven代理继承 --> <useMavenProxy>true</useMavenProxy> </wsdlOption> </wsdlOptions> </configuration> </execution> </executions> </plugin>
2. 直接给CXF插件指定JVM代理参数
如果全局代理配置没生效,可以直接给插件添加JVM系统参数,强制设置代理:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.6.2</version> <executions> <execution> <id>generate-wsdl-sources</id> <phase>generate-sources</phase> <goals> <goal>wsdl2java</goal> </goals> <configuration> <vmArgs> <!-- HTTP代理配置 --> <vmArg>-Dhttp.proxyHost=your-proxy-host.com</vmArg> <vmArg>-Dhttp.proxyPort=8080</vmArg> <!-- HTTPS代理配置(如果WSDL是HTTPS协议) --> <vmArg>-Dhttps.proxyHost=your-proxy-host.com</vmArg> <vmArg>-Dhttps.proxyPort=8080</vmArg> <!-- 代理认证(若需要) --> <!-- <vmArg>-Dhttp.proxyUser=your-username</vmArg> --> <!-- <vmArg>-Dhttp.proxyPassword=your-password</vmArg> --> <!-- 非代理主机列表 --> <vmArg>-Dhttp.nonProxyHosts=localhost|*.your-internal-domain.com</vmArg> </vmArgs> <wsdlOptions> <wsdlOption> <wsdl>http://your-service-host.com/service?wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> </execution> </executions> </plugin>
注意:如果你的WSDL是HTTPS地址,一定要同时配置https.proxyHost和https.proxyPort,否则插件还是会无法连接。
3. 本地缓存WSDL文件(应急方案)
如果代理配置始终搞不定,可以先手动把WSDL文件下载到项目本地,比如放在src/main/resources/wsdl/目录下,然后让插件读取本地文件:
<wsdl>src/main/resources/wsdl/your-service.wsdl</wsdl>
这种方式完全绕开网络请求,适合临时应急,但后续WSDL更新时需要手动替换文件。
4. 额外检查点
- 如果代理需要认证,确保
settings.xml里的代理配置或JVM参数中的用户名密码正确,注意密码是否需要加密(可以用Maven的密码加密工具处理)。 - 如果是HTTPS的WSDL,检查JVM是否信任目标服务器的SSL证书,必要时可以把证书导入到JVM的信任存储,或者添加JVM参数
-Djavax.net.ssl.trustStore=/path/to/your/truststore.jks指定自定义信任库。
配置完成后,运行mvn clean generate-sources命令测试,看是否能成功生成Java代码。
内容的提问来源于stack exchange,提问作者Μenelaοs
相关产品推荐
相关产品推荐

