Java 9环境下配置cxf-codegen-plugin遇问题求助
兄弟,我之前在Java 9环境下折腾cxf-codegen-plugin的时候也踩过这个一模一样的坑!这个错误的核心是插件的XML命名空间和Java 9模块系统的严格解析规则不兼容,给你几个亲测有效的解决办法:
升级CXF插件到兼容Java 9的版本
旧版本的cxf-codegen-plugin对Java 9的模块系统支持不完善,至少要升级到3.2.5及以上版本。在你的pom.xml里更新插件配置:<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.2.5</version> <!-- 你的其他插件配置 --> </plugin>修正插件配置中的命名空间问题
错误提示里的unexpected element (uri:"http://cxf.apache.org/tools/plugin", local:"databinding"),是因为你的<databinding>元素带了额外的命名空间前缀。检查pom.xml里的插件配置,确保<databinding>和<frontend>元素使用默认命名空间,不要带任何前缀:<configuration> <wsdlOptions> <wsdlOption> <wsdl>src/main/resources/your-service.wsdl</wsdl> <databinding>jaxb</databinding> <frontend>jaxws</frontend> </wsdlOption> </wsdlOptions> </configuration>完善module-info.java的模块依赖
除了添加java.se.ee到运行时模块,还要在你的模块声明里明确依赖CXF的相关模块,比如:module com.yourcompany.yourmodule { requires java.se.ee; requires org.apache.cxf.core; requires org.apache.cxf.jaxws; // 根据你的实际使用情况添加其他CXF模块 }确保Maven编译插件适配Java 9
同步把maven-compiler-plugin配置为支持Java 9,避免编译时的版本冲突:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>9</release> </configuration> </plugin>
简单说下原因:Java 9引入模块系统后,XML解析的命名空间校验变得更严格,旧版本CXF插件生成的配置元素会带上自定义命名空间,而解析器预期的是默认命名空间下的元素,所以就出现了这个“预期元素不匹配”的错误。按照上面的步骤调整后,应该就能正常构建了。
内容的提问来源于stack exchange,提问作者Daniel Skogquist Åborg

