【问题标题】:Replacement for wsimport with JDK 11用 JDK 11 替换 wsimport
【发布时间】:2018-11-12 17:02:00
【问题描述】:

我目前正在做一个需要 wsimport 但我们使用 JDK11 的项目,我刚刚发现 wsimport 自此版本以来已从 JDK 中删除。

我搜索了答案并尝试添加此依赖项,但目前无法正常工作。

     <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.2.11</version>
    </dependency>

是否有任何我不知道的 wsimport 替代品?

谢谢!

【问题讨论】:

标签: java spring wsimport


【解决方案1】:

今天,您可以使用 fork 作为 org.codehaus.mojo:jaxws-maven-plugin:2.5 的直接替代:

<plugin>
  <groupId>com.helger.maven</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <version>2.6</version>
  <configuration>
    ...
  </configuration>
</plugin>

https://github.com/phax/jaxws-maven-plugin。它适用于 jdk11

【讨论】:

    【解决方案2】:

    该插件的最新版本(目前为 2.6)适用于 Java 11。

    http://www.mojohaus.org/jaxws-maven-plugin/index.html

    【讨论】:

      【解决方案3】:

      我将添加我在升级到 JDK11 的研究中发现的内容,以防它对其他人有所帮助。

      Wsimport 作为 JDK 的一部分已被弃用,但已向 Eclipse 基金会开源。您可以通过以下链接下载:

      [https://repo1.maven.org/maven2/com/sun/xml/ws/jaxws-ri/2.3.0/jaxws-ri-2.3.0.zip][1]

      他们已将 wsimport 从可执行文件更改为调用 jaxws-tools.jar 文件的 bat/sh 脚本。我实际上并没有看到它工作并且总是得到一个 ClassNotFoundException:javax.activation.DataSource。我什至更改了他们的脚本以包含 javax.activation-api-1.2.0.jar,但它仍然无法正常工作。我尝试通过 Maven 构建还是在命令行运行它都没有关系。

      这是我的插件配置:

      <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>jaxws-maven-plugin</artifactId>
          <version>2.5</version>
          <dependencies>
              <dependency>
                  <groupId>com.sun.xml.ws</groupId>
                  <artifactId>jaxws-rt</artifactId>
                  <version>2.3.1</version>
              </dependency>
              <dependency>
                  <groupId>javax.activation</groupId>
                  <artifactId>javax.activation-api</artifactId>
                  <version>1.2.0</version>
              </dependency>
          </dependencies>
          <executions>
              <execution>
                  <id>app-wsdl-exec</id>
                  <phase>generate-sources</phase>
                  <goals>
                      <goal>wsimport</goal>
                  </goals>
                  <configuration>
                      <executable>${tool.wsimport}</executable>
                      <wsdlFiles>
                          <wsdlFile>${basedir}/src/main/resources/app.wsdl</wsdlFile>
                      </wsdlFiles>
                      <bindingDirectory>src/main/resources/binding</bindingDirectory>
                      <bindingFiles>
                          <bindingFile>ws-binding.xml</bindingFile>
                      </bindingFiles>
                      <packageName>com.app.ws</packageName>
                      <staleFile>${project.build.directory}/jaxws/stale/APP.done</staleFile>
                      <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
                      <xnocompile>false</xnocompile>
                      <useJdkToolchainExecutable>false</useJdkToolchainExecutable>
                      <keep>true</keep>
                  </configuration>
              </execution>
          </executions>
      </plugin>
      

      我还使用了以下内容,以便我可以在 Windows 上开发,而 Jenkins 可以在 Linux 上构建:

      <profiles>
          <profile>
              <id>win</id>
              <activation>
                  <os>
                      <family>windows</family>
                  </os>
              </activation>
              <properties>
                  <tool.wsimport>${env.JAXWS_HOME}/bin/wsimport.bat</tool.wsimport>
              </properties>
          </profile>
          <profile>
              <id>nix</id>
              <activation>
                  <os>
                      <family>!windows</family>
                  </os>
              </activation>
              <properties>
                  <tool.wsimport>${env.JAXWS_HOME}/bin/wsimport.sh</tool.wsimport>
              </properties>
          </profile>
      </profiles>
      

      【讨论】:

      【解决方案4】:

      JDK 11 的 jaxws-maven-plugin 尚未更新。项目上有一个 pull request 打开,但尚未合并。

      这里提出了一个 wsimport 的临时解决方案:https://github.com/javaee/metro-jax-ws/issues/1251#issuecomment-441424365,它可能在 Linux 上运行良好。

      在我们的项目中,我们使用的是 Windows 环境,我们根据以下示例修复了 wsimport:

      <plugins>
          <plugin>
              <artifactId>maven-antrun-plugin</artifactId>
              <version>1.8</version>
              <executions>
                  <execution>
                      <phase>generate-sources</phase>
                      <configuration>
                          <target>
                              <mkdir dir="target/generated-sources/wsimport"/>
      
                              <property name="plugin_classpath" refid="maven.plugin.classpath" />
      
                              <exec executable="java">
                                  <arg value="-classpath"/>
                                  <arg value="${plugin_classpath}"/>
                                  <arg value="com.sun.tools.ws.WsImport"/>
                                  <arg value="-extension"/>
                                  <arg value="-Xnocompile"/>
                                  <arg value="-wsdllocation"/>
                                  <arg value="/MyWSDL.wsdl"/>
                                  <arg value="-s"/>
                                  <arg value="target/generated-sources/wsimport"/>
                                  <arg value="-p"/>
                                  <arg value="com.company.client.generated"/>
                                  <arg value="src/main/resources/MyWSDL.wsdl"/>
                              </exec>
                          </target>
                      </configuration>
                      <goals>
                          <goal>run</goal>
                      </goals>
                  </execution>
              </executions>
              <dependencies>
                  <dependency>
                      <groupId>ant-contrib</groupId>
                      <artifactId>ant-contrib</artifactId>
                      <version>1.0b2</version>
                  </dependency>
                  <dependency>
                      <groupId>javax.jws</groupId>
                      <artifactId>javax.jws-api</artifactId>
                      <version>1.1</version>
                  </dependency>
                  <dependency>
                      <groupId>javax.xml.bind</groupId>
                      <artifactId>jaxb-api</artifactId>
                      <version>2.3.1</version>
                  </dependency>
                  <dependency>
                      <groupId>com.sun.xml.bind</groupId>
                      <artifactId>jaxb-core</artifactId>
                      <version>2.3.0.1</version>
                  </dependency>
                  <dependency>
                      <groupId>com.sun.xml.bind</groupId>
                      <artifactId>jaxb-impl</artifactId>
                      <version>2.3.2</version>
                  </dependency>
      
                  <!-- xml.ws module -->
                  <dependency>
                      <groupId>javax.xml.ws</groupId>
                      <artifactId>jaxws-api</artifactId>
                      <version>2.3.1</version>
                  </dependency>
                  <dependency>
                      <groupId>com.sun.xml.ws</groupId>
                      <artifactId>jaxws-rt</artifactId>
                      <version>2.3.1</version>
                      <exclusions>
                          <exclusion>
                              <!-- declare the exclusion here -->
                              <groupId>org.glassfish.jaxb</groupId>
                              <artifactId>txw2</artifactId>
                          </exclusion>
                      </exclusions> 
                  </dependency>
      
                  <!-- javax.activation -->
                  <dependency>
                      <groupId>javax.activation</groupId>
                      <artifactId>activation</artifactId>
                      <version>1.1.1</version>
                  </dependency>
      
                  <!-- wsimport -->
                  <dependency>
                      <groupId>com.sun.xml.ws</groupId>
                      <artifactId>jaxws-tools</artifactId>
                      <version>2.3.1</version>
                      <scope>compile</scope>
                  </dependency>
              </dependencies>
          </plugin>
          <plugin>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>build-helper-maven-plugin</artifactId>
              <executions>
                  <execution>
                      <id>add-source</id>
                      <phase>generate-sources</phase>
                      <goals>
                          <goal>add-source</goal>
                      </goals>
                      <configuration>
                          <sources>
                              <source>target/generated-sources/wsimport</source>
                          </sources>
                      </configuration>
                  </execution>
              </executions>
          </plugin>
      </plugins>
      

      【讨论】:

        【解决方案5】:

        终于成功了!以防万一有人遇到同样的问题:

        我想使用 maven build 来生成源代码,用这个 pom.xml :

        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>jaxws-maven-plugin</artifactId>
                    <version>2.4.1</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>wsimport</goal>
                            </goals>
                            <configuration>
                                <packageName>my.package</packageName>
                                <sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
                                <keep>true</keep>
                                <executable>${java.home}/bin/wsimport</executable>
                                <wsdlDirectory>src/main/resources/schemas</wsdlDirectory>
                                <bindingFiles>
                                    <bindingFile>${basedir}/src/bindings/binding.xjb</bindingFile>
                                </bindingFiles>
                                <target>2.1</target>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
        

        但是解决办法是直接用控制台运行wsimport:

        wsimport -d target/generated-sources/jaxws-wsimport/ -s target/generated-sources/jaxws-wsimport/ src/main/resources/schemas/myWSDLFile.wsdl
        

        当然,我使用的是 JDK 11

        【讨论】:

        • JDK 11 没有 wsimport 工具。所以我不确定你是怎么做你描述的。
        猜你喜欢
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 2019-04-14
        相关资源
        最近更新 更多