wsimport Maven任务异常求助:仅首次执行有效,后续无法生成代码
解决jaxws-maven-plugin重复执行不生成代码&命令行调用无效的问题
我之前也踩过这个jaxws-maven-plugin的坑,太让人头疼了!结合你的问题描述,我来拆解下原因和解决办法:
问题根源分析
- 命令行调用
mvn jaxws:wsimport忽略配置:你把所有配置都放在了<execution>节点里,但直接调用插件的默认goal时,Maven不会加载execution里的自定义配置,只会用插件的默认参数——这就是为什么你改了staleFile却没生效的原因。 - clean install后不生成代码:一方面是你指定的
phase是process-classes(这个阶段在compile之后),clean后执行install时,插件可能在编译完成后才运行,导致生成的代码没被纳入编译;另一方面是插件的stale检查机制——它会通过stale文件判断是否需要重新生成代码,clean后可能stale文件还保留着,插件误以为不需要更新。
具体解决方案
方案1:调整插件配置,让命令行和生命周期都能正常工作
建议换用官方维护的jaxws-maven-plugin(org.codehaus.mojo的版本比较老旧,容易出bug),然后调整配置结构和参数:
<plugin> <!-- 改用官方groupId,版本用最新稳定版 --> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>3.0.0</version> <!-- 配置生命周期内的执行逻辑 --> <executions> <execution> <id>generate-stubs1</id> <!-- 把phase改成generate-sources,确保代码在编译前生成 --> <phase>generate-sources</phase> <goals> <goal>wsimport</goal> </goals> <configuration> <wsdlUrls> <wsdlUrl>http://www.webservicex.com/globalweather.asmx?wsdl</wsdlUrl> </wsdlUrls> <packageName>com.sth.remote</packageName> <!-- 关闭stale检查,强制每次执行都重新生成代码 --> <staleCheck>false</staleCheck> <staleFile>${project.build.directory}/jaxws/stale2</staleFile> </configuration> </execution> </executions> <!-- 根节点的configuration,让直接调用mvn jaxws:wsimport时也能读取到配置 --> <configuration> <wsdlUrls> <wsdlUrl>http://www.webservicex.com/globalweather.asmx?wsdl</wsdlUrl> </wsdlUrls> <packageName>com.sth.remote</packageName> <staleCheck>false</staleCheck> <staleFile>${project.build.directory}/jaxws/stale2</staleFile> </configuration> </plugin>
方案2:如果不想修改插件groupId,针对旧版本的修复
如果你坚持用org.codehaus.mojo的版本,至少做这几个调整:
- 把
phase从process-classes改成generate-sources - 添加
<staleCheck>false</staleCheck>到configuration里 - 直接调用时指定execution id:
mvn jaxws:wsimport@generate-stubs1,这样就能加载你自定义的配置了
额外小贴士
- 执行
mvn clean install前,可以先手动删除target/jaxws目录,彻底清除stale文件缓存 - Eclipse里可以右键项目 → Maven → Update Project,强制刷新Maven配置,避免IDE缓存影响
内容的提问来源于stack exchange,提问作者Dawid D
相关产品推荐
相关产品推荐

