WsImport ant任务和JDK 6

时间:2011-07-28 16:26:36

标签: java web-services ant jax-ws wsimport

我正在尝试使用jax-ws来生成Web服务代理类,使用wsimport ant任务,类似于this question,具有以下后续问题:

据我了解,JDK 1.6的更新版本包括jax-ws,WsImport ant任务在JDK的tools.jar文件中定义。

为什么ant没有自动找到这个?

为什么eclipse也不会自动发现?

我发现了一些使用jax-ws与JDK 6的引用,但这些似乎是基于复制一个单独下载的jax-ws库并将其放入JDK ext文件夹(我假设不再需要它它现在实际上与JDK捆绑在一起。)

将wsimport任务与已包含jax-ws的JDK 1.6版本一起使用的正确方法是什么?

我的构建XML:

<?xml version="1.0" encoding="UTF-8"?>
<project name="wsproxy">
    <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport" />
    <target name="wsgentest">
        <wsimport
            wsdl="http://localhost/Service?wsdl"
            destdir="bin-gen"
            sourcedestdir="src-gen"
            keep="true"
            verbose="true"
            package="com.ws">
        </wsimport>
    </target>
</project>

2 个答案:

答案 0 :(得分:6)

事实证明,JDK中的WsImport类实际上不是一个ant任务,而是实际的wsimport命令行工具。我也误读了包名:com.sun.tools.internal.ws。

实际的ant任务可以在metro包here中的webservices-tools.jar中找到。您需要将它放在ant lib目录中。

答案 1 :(得分:1)

据我所知,与JDK6捆绑在一起的是二进制工具本身,而不是实际的Ant任务。

我的开发框中有Java 1.6.0_31,虽然是一个稍微特别的(JRockit R28.2.3),这是我发现正确使用wsimport任务的唯一方法。

  1. 从官方网站下载合适的JAX-WS版本。使用JDK6时,它应该是最高2.1.10的版本。如果您尝试使用2.2+版本,则会发生类路径冲突。
  2. 使用java -jar {jaxwsJarName}安装JAR内容,无论其名称是什么。此命令将创建一个[jaxws-ri]文件夹。
  3. 在所选位置复制[jaxws-ri/lib]文件夹的内容。尽管规模很大,但我喜欢在我自己的项目中使用外部库,以确保任何人都可以编译和打包代码而不需要外部工件。
  4. 在构建文件中创建taskdef项目和wsimport任务。
  5. 这是我的taskdef项目:

    <taskdef
        name="wsimport"
        classname="com.sun.tools.ws.ant.WsImport">
    
        <classpath>
            <fileset dir="${lib.dir}/jaxws-ri-2.1.10">
                <include name="**/*.jar" />
            </fileset>
        </classpath>
    </taskdef>
    

    这是我的wsimport任务:

    <target name="generate-code">
        <wsimport
            wsdl="${wsdl.dir}/${wsdl.name}-${wsdl.version}.wsdl"
            sourcedestdir="${src.dir}"
            destdir="${build.debug.dir}"
            package="${generated.code.package}">
    
            <depends file="${wsdl.dir}/${wsdl.name}-${wsdl.version}.wsdl" />
            <produces dir="${build.debug.dir}" />
        </wsimport>
    </target>