1

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

我希望每个客户端都打包在WEB-INF/libWAR 文件中自己的 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-pluginscansrc/main/resources/wsdl<wsdlRoot>)。

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

对于程序集,我可能会理清如何将生成的 JAR 文件-clientjar放入WEB-INF/lib其中,但在 WAR 中生成的类仍然存在问题。

我对 Maven 构建生命周期及其可能性没有深入的了解,非常欢迎任何建议或指示。

4

1 回答 1

5

这是我采取的方法。这不完全是我想要的,每个 WSDL 文件仍然有很多手动工作要做,并且与我想到的解决方案相去甚远(让 Maven 为项目中的每个 wsdl 自动创建单独的 JAR 工件并将它们用作依赖项)。

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

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

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

为方便起见,负责 WebService 客户端类生成的插件仅在 main 中定义一次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>

webapp 的 POM 不需要是父 POM 的子项,因为它不会使用cxf-codegen-plugin, 并且包含<dependency>s 用于每个 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>
于 2014-09-12T09:10:40.030 回答