使用Maven和cxf-codegen-plugin在JAR中打包WSDL客户端

时间:2014-09-03 15:28:50

标签: java maven cxf webservice-client cxf-codegen-plugin

我有一个maven项目会占用大量的网络服务。该应用程序将打包为WAR。到目前为止客户'代码已在cxf-codegen-plugin阶段使用generate-sources生成。默认情况下,生成的源位于target/generated-sources/cxf,在compile之后,它们将被编译并与target/classes中的应用程序类混合。生成的和应用程序类都可以共享第一级包。

我希望将每个客户端打包在WAR文件中WEB-INF/lib内的JAR中。我发现了-clientjar,但它只会生成.jar个文件并将它们放入target/generated-sources/cxf,并且JAR也会在target/classes中与编译后的类一起结束,毫无意义。

我认为compile插件在某个时刻正在将生成的源编译为target/classes,并且可能另一个阶段也在那里移动JAR。是否有可能让Maven避免编译那些生成的源(甚至让cxf-codegen-plugin根本不生成任何源,只生成JAR),并针对CXF生成的JAR编译应用程序类?

我知道可以通过为每个Web服务定义一个带有jar包装模块的多模块项目来实现这一目标,但我想避免使用此选项。可能存在大量的Web服务,并且不适合为每个服务维护独立的模块。使用-clientjar我已经被迫为每个WSDL定义<wsdlOption>,以便为每个WSDL提供JAR名称(不能让cxf-codegen-plugin只是src/main/resources/wsdl扫描<wsdlRoot>-clientjar)。

当然,客户端JAR可以在Maven外部生成并安装到本地存储库,并在项目中定义为依赖项,但是我想知道它是否可以在单个Maven构建。

对于程序集,我可能会理解如何将WEB-INF/lib生成的JAR文件放入{{1}},但WAR内部生成的类仍然存在问题。

我不太了解Maven构建生命周期及其可能性,非常欢迎任何建议或指示。

1 个答案:

答案 0 :(得分:4)

这是我采取的方法。它不是我想要的,还有很多手工工作要处理每个WSDL文件,并且远非我想到的解决方案(让Maven自动为每个wsdl创建单独的JAR工件)项目并将它们用作依赖项)。

具体来说,对于每个WSDL,这种方法需要:

  1. 创建包含WSDL文件的目录和包含不同工件名称的pom.xml
  2. 将该目录添加到顶级聚合器POM。
  3. 在webapp的POM中向WS客户端JAR工件添加依赖项。

  4. 我最终创建了一个聚合器(多模块)Maven项目,每个WebService客户端都有一个模块,它将生成一个带有生成的WS客户端类的JAR工件(遵循Maven的每个工件的约定) POM )。

    为方便起见,将负责生成WebService客户端类的插件仅在主pom.xml中定义一次,并且此POM是WS客户端生成POM的父级。重要的是要注意聚合器和父POM之间的区别。这两种概念在这种方法中一起使用。

    还有一个主要webapp模块。它的pom.xml指定了每个WS客户端JAR工件的依赖关系。

    这是项目目录树的大纲:

    |   pom.xml
    +-- WSClient1
    |   |   WebService1.wsdl
    |   |   pom.xml
    +-- WSClientN
    |   |   WebServiceN.wsdl
    |   |   pom.xml
    \---MyWebapp
        |   src
        |   pom.xml
    

    聚合器POM:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xsi...>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example.myproject</groupId>
        <artifactId>parent</artifactId>
        <version>1.0.0</version>
        <packaging>pom</packaging>
        <name>Aggregator POM</name>
        <properties>
            <!-- CXF version used for cxf-codegen-plugin -->
            <cxf.version>2.7.10</cxf.version>
        </properties>
    
        <modules>
                <!-- WS Client Modules -->
                <module>WSClient1</module>
                <module>WSClientN</module>
                <!-- WAR Module -->
                <module>MyWebapp</module>
        </modules>
    
        <!-- Project configuration every child POM will inherit -->
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-codegen-plugin</artifactId>
                    <version>${cxf.version}</version>
                    <executions>
                        <execution>
                            <id>generate-sources</id>
                            <phase>generate-sources</phase>
                            <configuration>
                                <!-- WSDL files will be at each project's root level -->
                                <wsdlRoot>.</wsdlRoot>
                            </configuration>
                            <goals>
                                <goal>wsdl2java</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    每个WS客户端POM都非常简单,只是一个工件名称并指定父级:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xsi...>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example.myproject</groupId>
        <artifactId>wsclient1</artifactId>
        <packaging>jar</packaging>
        <version>1.0.0</version>
        <name>WebService1 client</name>
    
        <parent>
          <groupId>com.example.myproject</groupId>
          <artifactId>parent</artifactId>
          <version>1.0.0</version>
        </parent>
    </project>
    

    网络应用程序的POM不需要成为父POM的子项,因为它不会使用cxf-codegen-plugin,并且每个都包含<dependency>个WS客户端工件之一:

     <dependency>
         <groupId>com.example.myproject</groupId>
         <artifactId>wsclient1</artifactId>
         <version>1.0.0</version>
     </dependency>
     <dependency>
         <groupId>com.example.myproject</groupId>
         <artifactId>wsclientN</artifactId>
         <version>1.0.0</version>
     </dependency>