【问题标题】:Axis2 web-service in a multi module maven project多模块 Maven 项目中的 Axis2 Web 服务
【发布时间】:2013-06-10 19:55:50
【问题描述】:

我有一个从多模块 maven 项目中的 WSDL 文件生成的axis2 web 服务。

wsdl2java 为我生成了存根和基本骨架。

将这些生成的存根集成到现有业务逻辑中的最佳方法是什么?

我有几个考虑:

  • 最简单的方法是在存根内部实现业务逻辑。但我相信这会导致麻烦:
    • 现在正在生成存根,作为mvn clean install 命令的一部分。 Maven clean 删除生成的源文件夹。我必须保护已实现业务逻辑的存根不被删除。
    • 我不想将生成的存根中的任何内容提交到 VCS。我想保持清洁。
  • 可以选择在另一个源文件夹中扩展存根类。这消除了以前方法的缺点,但给舞台带来了一些新的东西:
    • 正如我从 AXIS2 文档中了解到的,我必须在 services.xml 中指定服务类(这是使用 maven-axis2 插件生成的)。因此,应保护生成的存根的某些部分不被修改。

有没有办法避免这种情况?类似于在 web.xml 中指定服务类实现?或类似的东西?

【问题讨论】:

  • 我对@9​​87654325@ 的经验比Axis2 的经验要多,但您不只是在src/main/java 中实现生成的接口(通过复制实现存根或创建新的)并复制services.xml 到 src/main/resources (或任何合适的地方)?如果需要,您可以设置一个 Maven 配置文件来打开和关闭生成。
  • 让我们暂时离开 Maven 配置文件的问题。假设我想在每次构建项目时生成存根。 Axis 在 /src/main/generated 文件夹中生成存根、配置和实现。如果我想在我的代码中扩展实现,我必须提供配置(将被下一代 WS 覆盖)。所以我不得不在生成的文件夹中扩展存根实现,并从 maven clean 目标中排除存根实现。
  • 您也想每次都生成services.xml 文件吗?我只需将其复制到src/main/resources/META-INF/services.xml 并编辑它以指向src/main/java 中的实现类。

标签: java web-services maven axis2


【解决方案1】:

Axis2 符合 JAX-WS,因此您可以使用wsimport 工具代替wsdl2java。我假设您已采用合同优先方法,并且您正在从 WSDL 文件生成存根。这是 wsimport maven 插件的doc。很多东西都可以改变(例如destDir)。

Maven clean 删除生成的源文件夹。我必须保护已实现业务逻辑的存根不被删除。

您实际上可以将存根生成到您的常规包结构(可能是它自己的包)中,并在 maven clean 插件configuration 中添加包含(或排除)生成的文件。如果您使用此mvn plugin,您的 IDE 应将生成的文件添加到项目类路径中。

如果我是您,我肯定会尽可能多地尝试与 JAX-WS 兼容,因为如果您这样做,您将不会被供应商锁定到 Axis2。但是你将来可以切换到 CXF、Metro 或 Jboss WS。 services.xml 文件是 Axis2 特定的。

因此,生成的存根的某些部分应该受到保护,以免被修改。

您可以将这些资源标记为被您的 SCM 系统忽略。并将它们标记为在 Eclipse 中派生。这是mvn plugin。如果您这样做,开发人员将在尝试更改它们时收到通知。 IntelliJ IDEA 中一定也有类似的东西。

【讨论】:

  • 感谢您的回复。不幸的是,我们已经锁定了一些特定的技术堆栈(客户端遗留系统)。 JAX-WS 不是一个选项,因为必须首先创建 WSDL :(。目前我正在做一些与您的方法非常相似的事情,但我宁愿称之为黑客攻击,而不是一种干净的做事方式。
  • WSDL first 和 JAX-WS 实际上并不冲突
  • 是的,你是对的。但是使用 JAX WS 的全部意义在于消除 XML 样板。由于我们主要的 XML 来源是 WSDL 文件,所以我相信使用 JAX WS 的收益很小。
【解决方案2】:

你要做的就是配置maven pom,以便让maven完成工作。

第一步

首先你配置一个maven属性,我们称之为outputDirectory,该文件夹应该位于maven目标文件夹内,我通常不会在SCM中提交。

然后您必须配置Axis maven plugin 以便将存根源生成到目标文件夹中,如下所示

<build>
   <plugins>
      ...
          <plugin>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-wsdl2code-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsdl2code</goal>
                    </goals>
                    <configuration>
                        ... your configuration ..
                        <generateServerSide>true</generateServerSide>                                     
                        <generateServerSideInterface>true</generateServerSideInterface>
                        <outputDirectory>${outputDirectory}</outputDirectory>
                         ...
                    </configuration>
                </execution>
             </executions>
          </plugin>
          ...
      </plugins>
  </build>

如果 generateServerSideInterface 为 true,插件会生成一个名为 XXXSkeleton 的接口,您可以实现该接口。

第二步

然后你必须配置maven build helper plugin,以便包含生成的源代码。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <id>add-source</id>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${outputDirectory}</source>
                </sources>
            </configuration>
        </execution>
    </executions>      
</plugin>

我个人的看法是axis不是java Web服务的更好选择,JAX-WS兼容的框架是最好的选择,这里是jax-ws maven plugin的方法,生成源比axis源好得多并且干净。

【讨论】:

  • 嘿!我正在使用这个 maven 插件,但我之前没有注意到 generateServerSideInterface 配置标志。会尝试的。不幸的是,JAX-WS 不是一个选项。
猜你喜欢
  • 2015-04-30
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多