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

2024-04-29

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

我希望每个客户端都打包在自己的 JAR 中WEB-INF/lib在 WAR 文件中。我发现关于-clientjar,但它只生成.jar文件并将它们放入target/generated-sources/cxf,JAR 也最终出现在target/classes与编译的类一起,这是毫无意义的。

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

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

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

对于程序集,我可能会弄清楚如何放置由-clientjar into WEB-INF/lib但 WAR 中生成的类仍然存在问题。

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


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

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

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

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

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

还有一个用于主网络应用程序的模块。它是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>

Web 应用程序的 POM 不需要是父 POM 的子项,因为它不会使用cxf-codegen-plugin,并包括<dependency>每个 WS 客户端工件的 s:

 <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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Maven 和 cxf-codegen-plugin 将 WSDL 客户端打包在 JAR 中 的相关文章

  • 从文本文件中读取阿拉伯字符

    我完成了一个项目 在该项目中我读取了用记事本编写的文本文件 我的文本文件中的字符是阿拉伯语 文件编码类型是UTF 8 当在 Netbeans 7 0 1 中启动我的项目时 一切似乎都正常 但是当我将项目构建为 jar 文件时 字符以这种方式
  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 在 Java 中使用 Batik 检查和删除 SVG 中的属性

    这个问题基本上说明了一切 如何检查 SVG 是否具有 viewBox 属性 我正在使用蜡染库 我需要这个 因为我需要 至少 通知用户有一个 viewBox 属性 我可以删除它吗 使用 org w3c dom 类 您可以按照以下方式做一些事情
  • 在 jTextfield 中禁用“粘贴”

    我有一个用 Swing awt 编写的应用程序 我想阻止用户将值粘贴到文本字段中 有没有办法在不使用动作监听器的情况下做到这一点 您可以使用 null 参数调用 setTransferHandler 如下所示 textComponent s
  • 如何在url请求中发送数组

    我的要求如下 我想给出演员姓名 开始日期 结束日期并获取他在该时期出演的所有电影 因此 我的服务请求是这样的 http localhost 8080 MovieDB GetJson name Actor startDate 20120101
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • 最快的高斯模糊实现

    如何以最快的速度实施高斯模糊 http en wikipedia org wiki Gaussian blur算法 我要用Java来实现它 所以GPU http en wikipedia org wiki Graphics processi
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 以有效的方式从 Map 中删除多个键?

    我有一个Map
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • 在grails控制器中识别ajax请求或浏览器请求

    我正在开发一个使用大量ajax的grails应用程序 如果请求是ajax调用 那么它应该给出响应 这部分正在工作 但是如果我在浏览器中输入URL 它应该带我到主页 索引页面而不是请求的页面 下面是ajax调用的示例gsp代码
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • 插入时的 iBatis 判别器

    我有一个抽象类Example以及与之相伴的具体子类 我使用鉴别器来提取数据out数据库的 像这样
  • 正确签名的 JNLP 应用程序无法在 Java 7 中运行

    我有一个 JNLP 应用程序 由于证书过期需要更新 我有一个经过 CA 验证的新证书 我已将新证书导入到我的密钥库中 我已导入完整的证书链 我的构建文件对构建中的 jar 进行签名和时间戳
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • spring data jpa复合键重复键记录插入导致更新

    我有一个具有复合键的实体 我试图通过使用 spring data jpa 存储库到 mysql 数据库来持久化它 如下所示 Embeddable public class MobileVerificationKey implements S
  • 受信任的 1.5 小程序可以执行系统命令吗?

    如果是的话 这个能力有什么限制吗 具体来说 我需要以 Mac OSX 为目标 我以前用过这个在 Windows 系统上启动东西 但从未在 Mac 上尝试过 public void launchScript String args Strin
  • 如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

    使用 Apache commons net 的 Java FTPSClient 进行会话恢复是一个已知问题 会话恢复是 FTPS 服务器数据连接所需的一项安全功能 Apache FTPSClient 不支持会话恢复 并且 JDK API 使
  • Errors/BindingResult 参数应在模型属性、@RequestBody 或 @RequestPart 参数之后立即声明

    我通过剖析示例应用程序来自学 Spring 然后到处添加代码来测试我在剖析过程中开发的理论 在测试添加到 Spring 应用程序中的一些代码时 我收到以下错误消息 An Errors BindingResult argument is ex
  • java中void的作用是什么?

    返回类型 方法返回值的数据类型 如果方法不返回值 则返回 void http download oracle com javase tutorial java javaOO methods html http download oracle

随机推荐