这是我对“来自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'之后完成,并且可以简单地安装到存储库中。
有关最佳方法的任何建议/经验吗?
答案 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 client,Using the ejb-client as a dependency和ejb 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>