在哪里使用wsgen?

时间:2011-06-23 20:29:58

标签: java jax-ws wsgen

似乎不知道在我的WebService类中正确使用wsgen的位置(目录 - 源或类)...

创建基于WebService的示例文档文字:

package hello;

import javax.jws.WebService;

@WebService
public class HelloWorld {

public void sayHello() {
        System.out.println("Welcome to JAX-WS 2!");
    }
}

像这样创建了发布者:

package hello;

import javax.xml.ws.Endpoint;

public class Publisher {
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8080/jaxws/hello", new HelloWorld());
    }
}

使用Eclipse Helios,我会自动将这两个文件构建为相应类目录下的* .classes。

所以,从文件系统来看,我的项目看起来像这样:

/code/jws_sample
          |
          src
             |
              hello
                  |
                  HelloWorld.java
                  Publisher.java
          |
           classes
                    |
                    HelloWorld.class
                    Publisher.class

我会在哪个目录中运行wsgen?

当我在里面尝试时:

/ code / jaxws_sample / src / wsgen -cp。 hello.HelloWorld

收到:

  Class not found: "hello.HelloWorld"

  Usage: WSGEN [options] <SEI>

  where [options] include:

  -classpath <path>          specify where to find input class files

  -cp <path>                 same as -classpath &lt;path&gt;

  -d <directory>             specify where to place generated output files

  -extension                       
                             allow vendor extensions - functionality not specified
                             by the specification.  Use of extensions may
                             result in applications that are not portable or
                             may not interoperate with other implementations
   -help                     display help

   -keep                     keep generated files

   -r <directory>            resource destination directory, specify where to
                             place resouce files such as WSDLs

   -s <directory>            specify where to place generated source files

   -verbose                  output messages about what the compiler is doing

   -version                  print version information

   -wsdl[:protocol]          generate a WSDL file. The protocol is optional.
                             Valid protocols are [soap1.1, Xsoap1.2],
                             the default is soap1.1.
                             The non stanadard protocols [Xsoap1.2]
                             can only be used in conjunction with the
                             -extension option.

   -servicename <name>       specify the Service name to use in the generated WSDL
                             Used in conjunction with the -wsdl option.

   -portname <name>          specify the Port name to use in the generated WSDL
                             Used in conjunction with the -wsdl option.

   Examples:

   wsgen -cp . example.Stock
   wsgen -cp . example.Stock -wsdl -servicename {http://mynamespace}MyService

它确实在浏览器中向我展示了WSDL,当我尝试从$ MyProject / classes发出wsgen命令时,它实际上创建了一个带有SayHelloResponse.class文件但不是SayHelloResponse.java文件的jaxws文件夹? / p>

感谢您抽出宝贵时间阅读本文。

6 个答案:

答案 0 :(得分:7)

看起来您必须首先将文件编译为类文件,然后将它们提供给wsgen。

classpath <path>          specify where to find input **class files**

我可能错了,但我相信我过去也必须这样做。

谢谢,

Jeffrey Kevin Pry

答案 1 :(得分:1)

您需要启用'-keep'并且您可以选择指定'-s / path / to / src'来保存JAXWS生成的文件。由于这些是生成的文件,因此最佳实践通常会指导您不要保留文件并仅生成文件以进行打包。保留文件并可能编辑它们的缺点是,如果重新生成文件,您的更改可能会丢失。

例如,我有一个在Maven项目中定义的JAX-WS端点,每次打包服务时都会调用WSGEN目标。

答案 2 :(得分:1)

你需要对你的sei类文件而不是源文件运行wsgen。 cd退出src目录并进入类目录,wsgen对着HelloWorld.class

答案 3 :(得分:1)

有点迟到但我可以帮助别人。我正在使用此脚本在需要时生成WSDL和XSD(仅限Windows)。可以轻松为Linux和Mac做好准备。我正在使用glassfish appserver的库。您可以将这些库替换为您的应用服务器或裸库。

@echo off
set WSGEN="C:\Java\jdk1.6.0_39\bin\wsgen.exe"
set J1="C:\Java\jdk1.6.0_39\lib\tools.jar"
set J2="C:\Java\glassfish-3.1.2.2\glassfish\modules\webservices-osgi.jar"
set J3="C:\Java\glassfish-3.1.2.2\glassfish\modules\endorsed\webservices-api-osgi.jar"
set J4="C:\Java\glassfish-3.1.2.2\glassfish\modules\jaxb-osgi.jar"
set J5="C:\Java\glassfish-3.1.2.2\glassfish\modules\endorsed\jaxb-api-osgi.jar"
set J6="C:\Java\glassfish-3.1.2.2\glassfish\modules\javax.ejb.jar"
set J7="D:\NetBeansProjects\OTP\target\OTP-1.0\WEB-INF\lib\commons-lang3-3.1.jar"
set J8="D:\NetBeansProjects\OTP\target\OTP-1.0\WEB-INF\lib\commons-codec-1.8.jar"
set OUTPUT_DIR="D:\NetBeansProjects\OTP"
@echo on
%WSGEN% -classpath %J1%;%OUTPUT_DIR%\target\classes;%J2%;%J3%;%J4%;%J5%;%J6%;%J7%;%J8%; -d %OUTPUT_DIR%\jax-ws -Xendorsed -keep -wsdl -r %OUTPUT_DIR%\jax-ws -s %OUTPUT_DIR%\jax-ws -verbose com.avalant.ws.GenerateOTPWS

答案 4 :(得分:0)

首先,您需要在“hello”目录下创建目录“jaxws”。

然后,尝试从“/ code / jws_sample”目录运行此命令:

wsgen -keep -cp classes/ -s src/ HelloWorld

-s 命令告诉生成器放置源文件的位置。

这是使用我在工作中使用的脚本创建的,在提交之前无法对此进行测试。但是,我希望这会给你一些指导。

答案 5 :(得分:0)

奇怪的是你生成的类文件不在/ classes / hello /中,因为你的软件包说...

好吧,考虑到您的类文件在/classes/hello/HelloWorld.class中应该如此,您只需要从您的类文件夹执行

wsgen -keep -cp。 -d。 -s ../src hello.HelloWorld

刚刚检查并为我工作正常。 Remebember,从您的类文件夹中调用CMD