使用 JDK 21 构建时 Wsimport 失败

问题描述 投票:0回答:1

我正在尝试将服务从 Java 8 升级到 JDK 17。我对 Maven 还很陌生。下面是maven pom.xml文件。

<plugin>
                <groupId>com.sun.xml.ws</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>4.0.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                        <configuration>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <wsdlDirectory>${wsdlDir}</wsdlDirectory>
                    <bindingDirectory></bindingDirectory>
                    <verbose>true</verbose>
                    <sourceDestDir>${basedir}/src/test/java</sourceDestDir>
                    <extension>true</extension>
                    <xjcArgs>
                            <xjcArg>-Xcollection-setter-injector</xjcArg>
                    </xjcArgs>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.sun.istack</groupId>
                        <artifactId>istack-commons-runtime</artifactId>
                        <version>4.1.1</version>
                    </dependency>
                    <dependency>
                        <groupId>com.sun.istack</groupId>
                        <artifactId>istack-commons-tools</artifactId>
                        <version>4.2.0</version>
                    </dependency>
                    <dependency>
                        <groupId>com.sun.xml.ws</groupId>
                        <artifactId>jaxws-rt</artifactId>
                        <version>4.0.1</version>
                    </dependency>
                    <dependency>
                        <groupId>com.sun.xml.ws</groupId>
                        <artifactId>jaxws-tools</artifactId>
                        <version>4.0.1</version>
                    </dependency>
                    <dependency>
                        <groupId>javax.jws</groupId>
                        <artifactId>jsr181-api</artifactId>
                        <version>1.0-MR1</version>
                    </dependency>
                    <dependency>
                        <groupId>org.andromda.thirdparty.jaxb2_commons</groupId>
                        <artifactId>collection-setter-injector</artifactId>
                        <version>1.0</version>
                    </dependency>
                </dependencies>
            </plugin>

当尝试使用 Maven 构建此文件时,我在解析 wsdl 文件时遇到错误。

parsing WSDL...

[ERROR] Unexpected <bindings> appears at line 5 column 17
  line 5 of http://dummy.pseudo-schema#schema2

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.jvnet.jax_ws_commons.jaxws.Invoker.main(Invoker.java:74)
Caused by: com.sun.tools.ws.wscompile.AbortException
        at com.sun.tools.ws.processor.modeler.wsdl.JAXBModelBuilder.bind(JAXBModelBuilder.java:114)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildJAXBModel(WSDLModeler.java:2265)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:164)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:111)
        at com.sun.tools.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:413)
        at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:180)
        at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:158)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        ... 2 more

下面是正在使用的 jax-ws 绑定文件(由于政策删除了一些细节)

<?xml version="1.0" encoding="UTF-8"?>
<bindings version="2.1" wsdlLocation=""
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        xmlns="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl">
    
    <globalBindings>
        <javaType name="java.util.Date" xmlType="xs:date"
                  parseMethod=""
                  printMethod=""
        />
        <javaType name="java.util.Date" xmlType="xs:dateTime"
                  parseMethod=""
                  printMethod=""
        />
        <xjc:serializable/>
    </globalBindings>
</bindings>


使用 Java 8 构建项目时,相同的配置也有效。有人可以让我知道到底是什么问题吗?我对这些插件还很陌生,所以很难找到问题。

jaxb jax-ws wsimport
1个回答
0
投票

以上配置有两点:

1。您的标头定义对于雅加达迁移不正确

应该是下面这个

<bindings version="3.0" wsdlLocation=""
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        xmlns="https://jakarta.ee/xml/ns/jaxb"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl">

如果您不针对 jakarta(例如,Spring v6 以下/SpringBoot v3 以下)但只需要 Java17,那么插件本身应更改为以下内容:

<plugin>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.3.7</version>
    <!-- configuration like above here -->
</plugin>

2。我还发现您正在使用以下插件,但该插件不在活动开发状态下:

<dependency>
  <groupId>org.andromda.thirdparty.jaxb2_commons</groupId>
  <artifactId>collection-setter-injector</artifactId>
  <version>1.0</version>
</dependency>

此插件位于

org.jvnet.jaxb:jaxb-plugins:4.0.0
,您可以在 here 找到,并且可以使用
-Xsetters
激活(插件文档 here。只需将上述依赖项替换为新依赖项即可。

对于基于雅加达的版本,请使用此:

<dependency>
  <groupId>org.jvnet.jaxb</groupId>
  <artifactId>jaxb-plugins</artifactId>
  <version>4.0.0</version>
</dependency>

对于非基于雅加达的版本,请使用此:

<dependency>
  <groupId>org.jvnet.jaxb</groupId>
  <artifactId>jaxb2-basics</artifactId>
  <version>2.0.9</version>
</dependency>

还有一点:

org.andromda.thirdparty.jaxb2_commons
groupId 中的一些插件目前已集成在 jaxb-plugins 4.0.1 中。

© www.soinside.com 2019 - 2024. All rights reserved.