Maven:结合网络项目

时间:2010-01-14 12:17:09

标签: maven-2 include webproject

我已经设置了以下Maven项目:

  • PM核
  • PM-Web(依赖于PM-Core)
现在,这个项目用于多个客户端,但是每个客户端都存在一些细微差别:配置文件的差异主要是一些客户端还需要额外的java文件(可能不会为其他客户端安装)。

我一直在考虑如何使用maven来支持这一点,但我仍然在寻找完美的解决方案。

我能想到的最佳解决方案是为每个客户端创建一个单独的maven项目(例如PM-CLIENT1,...),它只包含客户端特定的配置文件和其他java文件或jsp,....下一步是将PM-Web项目和客户端项目视为一个Web项目,这意味着:将它们组合(打包)为1个war文件,其中来自客户端项目的文件优先于PM-Web项目中的文件。 / p>

更具体:在PM-Client1上运行mvn package将从PM-Web获取所有内容,从PM-Client1添加/替换文件,然后将其打包成单个战争。

所以问题是:如何用maven实现这个目标?

3 个答案:

答案 0 :(得分:4)

是的,可以使用Overlays完成此操作。网页上的示例正是您所说的。

对于项目结构,您可以这样:

.
|-- PM-Core
|-- PM-WebCommon (of type war, depends on core)
|-- PM-Client1 (of type war, depends on webcommon)
`-- PM-Client2 (of type war, depends on webcommon)

在PM-Client1和PM-Client2中使用overlay将它们与PM-WebCommon“合并”并为每个客户端打包。

更新我不会涵盖所有细节,但我认为在使用叠加层时需要使用类型runtime范围声明战争依赖关系,这就是叠加层的工作原理(实际上,整个叠加的东西是一种黑客)。现在,要解决您的eclipse问题,一个解决方案是创建一个包含PM-WebCommon项目类的JAR。为此,请使用attachClasses可选参数并将其设置为true。这将告诉maven创建一个PM-WebCommon-<version>-classes.jar,然后您就可以在PM-Client1中声明为依赖关系(具有provided范围)。有关详细信息,请查看MWAR-73MWAR-131。这也在war插件的FAQ中讨论过。请注意,这不是推荐的做法,正确的方法是将类移动到一个单独的模块(这是我想提到的另一个解决方案)。

更新(201001018):我尝试了attachClasses参数,它适用于插件的2.1-beta-1版本。

答案 1 :(得分:1)

您可以使用profiles查看http://maven.apache.org/guides/mini/guide-building-for-different-environments.html并使用classifiers来区分同一版本的不同版本中的工件。 在此设置中,您可以为父项目下的每个客户特定自定义创建其他可选模块,即 + PM
++ PM-Core
++ PM-Web
++ PM-Client1
++ PM-Client2

或者您可以使用maven assembly plugin

来查看

答案 2 :(得分:1)

还要比较问题different WAR files, shared resources的答案。