在同一个maven项目中创建和使用Webservices

时间:2011-02-11 09:36:10

标签: java maven jax-ws wsimport wsgen

我正在尝试构建一个maven项目,一个包含Webservices的OSGi包。我正在使用带有所有@WebService注释的JAX-WS来指定我拥有的Web服务。要在客户端位置加载这些Web服务,通​​常使用wsgenwsimport来导出/导入WSDL文件。我打算使用jaxws-maven-plugin这样做,但问题出在这里:

捆绑包可以同时充当服务器和客户端。它可以将自身注册为同一捆绑包的父节点的客户端(在不同的JVM /主机上运行)。所以这个maven项目/包定义了webservice的接口,并定义了一个实现这个接口的实现类。接口和类都像往常一样使用@WebService注释。

@WebService
public interface Example {
    public void callMe();
}

@WebService
public class ExampleImpl implements Example {
    public void callMe() {};
}

然后在我的代码中的某处:

Endpoint p = Endpoint.publish(
                 "http://localhost:8080/example",
                 new ExampleImpl());    

jaxws:wsgen goal读取注释并创建输出文件(.class文件,.java文件,WSDL文件,具体取决于配置......)。但是,如何在jaxws:wsimport目标期间为同一mvn package次运行使用这些文件?在同一个maven项目中我想使用这个web服务,所以我需要写这样的东西:

ExampleImplService service = new ExampleImplService();
Example port = service.getExampleImplPort();
port.callMe();

jaxws:gen目标正在process-classes阶段运行,因为它需要读取已编译的类,但必须在jaxws:import阶段运行generate-sources以准备所有内容编译。而现在我遇到了鸡蛋问题。我需要编译的类通过wsgen生成输出文件,但我需要在wsgen maven的wsimport阶段generate-sources的{​​{1}}输出文件。我的第一个尝试是将jaxws:wsgen目标分配给generate-sources阶段,但当然它不起作用,因为类缺失/尚未编译。

我有什么方法可以解决这个问题?我应该在antrun阶段之前运行@WebService目标来编译一些类(即只有generate-sources注释的类),以便jaxws:wsgen可以使用它(在该阶段),创建输出文件,然后由jaxws:wsimport阶段的generate-sources使用?还有其他方法可以解决这个鸡蛋问题吗?在同一个maven项目中是否还有其他“maven方法”来编译webservices的服务器和客户端部分?它应该顺便说一句。从一个干净的mvn clean版本运行,所以我不希望/喜欢任何解决方案,如“运行mvn package两次,先生成webservices文件然后再编译其他所有”。换句话说:mvn clean package应该编译整个maven项目/ osgi包。

2 个答案:

答案 0 :(得分:1)

我已设法通过将jaxsw:wsgen目标移至generate-sources阶段来解决此问题。我使用以下步骤。

  1. 首先,我通过@WebService执行编译带有antrun注释的类,它使用<javac>来编译类。我将生成的.class文件保存在一个临时目录中,该目录在创建客户端存根之后被删除。
  2. 我使用jaxws:wsgen目标从已编译的.class文件创建WSDL文件。
  3. 从临时目录中创建具有正常jaxws:wsimport目标的客户端存根。
  4. 我删除临时目录,执行第二次antrun
  5. 生成的pom.xml文件如下所示(仅限相关部分)

    <properties>
        <tmpdirectory>${java.io.tmpdir}${file.separator}${user.name}-${project.groupId}-${project.artifactId}</tmpdirectory>
    </properties>
    ...
            <plugin>
                <!-- clean tmp directory at every "mvn clean" -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>${tmpdirectory}</directory>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.6</version>
                <dependencies>
                      <dependency>
                          <groupId>com.sun</groupId>
                          <artifactId>tools</artifactId>
                          <version>1.6.0</version>
                          <scope>system</scope>
                          <systemPath>${java.home}/../lib/tools.jar</systemPath>
                      </dependency>
                </dependencies>  
                <executions>
                    <execution>
                        <!-- compile webservice classes into tmp directory -->
                        <id>mini compile of webservices</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <property name="compile_classpath" refid="maven.compile.classpath"/>
                                <mkdir dir="${tmpdirectory}" />
                                <javac includeAntRuntime="false"
                                       classpath="${compile_classpath}"
                                       destdir="${tmpdirectory}">
                                    <src path="${project.build.sourceDirectory}" />
                                    <include name="org/example/project/*/webservice/*.java" />
                                </javac>
                            </target>
                        </configuration>
                    </execution>
                    <execution>
                        <!-- delete temporary directory (in case mvn clean is not called) -->
                        <id>clean up tmp dir</id>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <delete dir="${tmpdirectory}" />
                            </target>
                        </configuration>
                    </execution>
                </executions>  
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>1.10</version>
                <executions>
                    <execution>
                        <!-- generate WSDL file from the compiled classes in tmp directory -->
                        <id>generate wsdl file</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>wsgen</goal>
                        </goals>
                        <configuration>
                            <sei><!-- service endpoint implementation  --></sei>
                            <destDir>${tmpdirectory}</destDir>
                            <genWsdl>true</genWsdl>
                            <resourceDestDir>${tmpdirectory}</resourceDestDir>
                        </configuration>
                    </execution>
                    <execution>
                        <!-- create client stub files -->
                        <id>create client files from wsdl file</id>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                        <configuration>
                            <keep>true</keep>
                            <wsdlDirectory>${tmpdirectory}</wsdlDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
    

答案 1 :(得分:0)

在您定义插件的地方,您必须设置两个单独的执行,一个用于wsgen,另一个用于wsimport。

...时间过去......

Use Maven to trigger a wsgen & wsimport in a row, using wsdlLocation