【问题标题】:Maven (EJB) project with client and server artifacts具有客户端和服务器工件的 Maven (EJB) 项目
【发布时间】:2009-12-18 15:52:23
【问题描述】:

这是我对“来自 Maven 构建的多个工件”问题的变体:

我正在从 Ant 移植到 Maven。我的应用程序是一个封装为 EAR 的 EJB 服务器,但它还公开了一个客户端 JAR 以供其他客户端应用程序使用。这个 jar 包含 EJB 接口、外观类和一些帮助器。

我知道 Maven 方式是每个项目有一个工件 (POM);但是,两个工件(服务器 EAR 和客户端 JAR)都需要从相同的源树构建 - 服务器和客户端共享,例如 EJB 和“主”接口。

如何在 Maven 中做到这一点?

我是否有一个项目包含两个 POM,比如 server-pom.xml 和 client-pom.xml?我在想我也可以有一个父 POM(pom.xml),它可以用来构建客户端和服务器,一举一动?但是,在“打包”阶段之后,生命周期会有所不同,因为服务器必须经过组装(tar/gzip),而客户端在“打包”之后完成,可以简单地安装到存储库中。

关于解决此问题的最佳方法的任何建议/经验?

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    我知道 Maven 方式是每个项目有一个工件 (POM);但是,两个工件(服务器 EAR 和客户端 JAR)都需要从相同的源树构建 - 服务器和客户端共享,例如 EJB 和“主”接口。

    “每个项目一个工件”规则有一些例外,EJB 项目就是其中之一。因此,maven-ejb-plugin 可以配置为生成 EJB jar这样的客户端 JAR:

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ejb-plugin</artifactId>
            <configuration>
               <generateClient>true</generateClient>
            </configuration>
          </plugin>
        </plugins>
      </build>
    

    要在另一个项目中使用 ejb 客户端,只需将其添加为 &lt;type&gt;ejb-client&lt;/type&gt; 的依赖项即可:

    <project>
      [...]
      <dependencies>
        <dependency>
          <groupId>com.example</groupId>
          <artifactId>ejb-project</artifactId>
          <version>1.0-SNAPSHOT</version>
          <type>ejb-client</type>
        </dependency>
      </dependencies>
      [...]
    </project>
    

    请参阅Generating an EJB clientUsing the ejb-client as a dependencyejb mojo 的文档了解更多详细信息(包括如何自定义 ejb 客户端包含/排除的类)。

    【讨论】:

    • @Pascal,这很好用,除非 EJB 客户端是同一个多模块项目中另一个模块的依赖项。首先,您不能将 EJB 客户端用作父模块列表中的嵌套模块,因为它没有自己的文件夹——它只是 EJB 模块的副产品。其次,EJB 客户端工件仅在打包阶段创建,因此反应器无论如何都无法将其添加到组合类路径中。
    • 所以看来我必须放弃这种方法并为 EJB 客户端创建一个显式模块。但是,这意味着这个新的“ejb-client”模块必须与主“ejb”模块共享 Java 源代码(共享 EJB 接口)。我假设我会将源代码保留在主“ejb”模块中,并将“ejb-client”模块配置为指向相同的源文件夹(例如 ../ejb/src)?
    • @Cornel 嗯……什么? 1. 您不应该将 ejb-client 声明为模块 2. 在 rector 构建期间考虑 ejb-client 依赖项以计算构建顺序 3. 类路径是使用本地存储库构建的,因此您必须install 您的 ejb 客户端,就像任何其他工件一样。换句话说,我不明白你在说什么:)
    • 我希望有一种方法可以编译一个复杂的多模块项目——其中一些嵌套模块依赖于其他模块(对等)——一次性,即无需先手动编译并安装那些依赖的模块。
    • @Cornel 对于多模块项目,您总是需要运行mvn install,模块之间的依赖关系通过本地存储库解决。
    【解决方案2】:

    我以前用multimodule projects解决过这个问题。

    project/
        pom.xml  <- type=pom, lists sub modules
        ejb/
            src/main/java, etc.
            pom.xml <- type=ejb, describes ejb module, has dependency on "jar" module
        jar/ 
            src/main/java, etc.
            pom.xml <- type=jar, simple, builds jar
        ear/ 
            pom.xml <- type=ear, has reference to ejb module that it should use
        ...
    

    我已将这种方法用于相当复杂的项目,这些项目可能有十几个不同的模块必须一起构建。请参阅ear docs 以引用 ejb。

    父pom.xml使用modules标签:

    <modules>
        <module>jar</module>
        <module>ejb</module>
        <module>ear</module>
    </modules>
    

    而子 pom.xml 使用 parent 标签:

    <parent>
        <groupid>mygroup</group>
        <artifactId>parentName</artifactId>
    </parent>
    

    【讨论】:

    • @John,我同意多模块方法。我不太确定我是否了解 client 的 EAR 包装的使用:client jar 不应该在 EAR 中,而且它也需要构建来自与 EAR 代码相同的代码库 (src/main/java),因为两个工件共享 EJB 接口/home 类。
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多