具有客户端和服务器工件的Maven(EJB)项目

时间:2009-12-18 15:52:23

标签: maven-2

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

我从Ant移植到Maven。我的应用程序是一个打包为EAR的EJB服务器,但它也公开了一个客户端JAR供其他客户端应用程序使用。这个jar包含EJB接口,facade类和一些帮助程序。

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

如何在Maven中执行此操作?

我是否有一个包含两个POM的项目,比如server-pom.xml&客户的pom.xml?我以为我也可以有一个父POM(pom.xml)可以用来构建客户端和服务器一次犯规?但是,生命周期在'包'阶段后出现分歧,因为服务器必须经过汇编(tar / gzip),而客户端在'package'之后完成,并且可以简单地安装到存储库中。

有关最佳方法的任何建议/经验吗?

2 个答案:

答案 0 :(得分:18)

  

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

“每个项目一个工件”规则有一些例外,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客户端,只需将其添加为<type>ejb-client</type>的依赖项:

<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客户端中包含/排除的类)。

答案 1 :(得分:6)

我之前使用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>