JavaFX+Maven构建SOAP客户端依赖冲突问题求助
解决方案:JavaFX + Maven SOAP客户端依赖冲突处理
问题根源
- 引入
jaxws-rt时触发的LayerInstantiationException,是因为JavaFX内置模块已包含org.glassfish.jaxb.runtime,而jaxws-rt依赖的旧版com.sun.xml.bind与前者存在包重复。 - 移除
jaxws-rt后出现的ProviderImpl not found,是缺少JAX-WS运行时实现导致的。
正确依赖配置
使用Jakarta EE兼容的Metro运行时,主动排除与JavaFX冲突的JAXB模块,避免重复加载。以下是完整的依赖配置:
<dependencies> <!-- JavaFX 依赖(根据你的实际版本调整) --> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>21.0.1</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>21.0.1</version> </dependency> <!-- Metro JAX-WS 运行时,排除冲突的JAXB模块 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>4.0.3</version> <exclusions> <!-- 排除JavaFX已自带的JAXB模块 --> <exclusion> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> </exclusion> </exclusions> </dependency> <!-- JAX-WS API 依赖 --> <dependency> <groupId>jakarta.xml.ws</groupId> <artifactId>jakarta.xml.ws-api</artifactId> <version>4.0.1</version> </dependency> </dependencies>
jaxws-maven-plugin 配置
确保插件生成Jakarta兼容的客户端代码,同时排除插件依赖中的冲突模块:
<build> <plugins> <!-- JavaFX 打包插件(保留你已有的配置) --> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>你的主类全路径</mainClass> </configuration> </plugin> <!-- JAX-WS 客户端生成插件 --> <plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>4.0.3</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> <configuration> <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory> <!-- 生成Jakarta规范兼容的代码 --> <args> <arg>-extension</arg> <arg>-Xnocompile</arg> <arg>-jakarta</arg> </args> <packageName>你的SOAP客户端包路径</packageName> </configuration> </execution> </executions> <!-- 插件依赖排除冲突模块 --> <dependencies> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-tools</artifactId> <version>4.0.3</version> <exclusions> <exclusion> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </plugin> </plugins> </build>
模块化项目额外配置
如果你的项目使用模块系统(存在module-info.java),需要添加以下模块声明:
module 你的模块名 { requires javafx.controls; requires javafx.fxml; requires jakarta.xml.ws.api; requires com.sun.xml.ws.runtime; // 允许SOAP客户端类被Metro运行时访问 opens 你的SOAP客户端包路径 to com.sun.xml.ws.runtime; }
验证步骤
- 执行
mvn clean install重新生成客户端类并构建项目。 - 启动JavaFX应用,点击测试按钮发送SOAP请求,确认无模块冲突和Provider找不到的错误。
内容的提问来源于stack exchange,提问作者cactus
相关产品推荐
相关产品推荐

