5

我设置了以下 Maven 项目:

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

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

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

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

所以问题是:如何用 maven 实现这一点?

4

3 回答 3

4

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

对于项目结构,你可以有这样的东西:

.
|-- PM-核心
|-- PM-WebCommon (war 类型,取决于核心)
|-- PM-Client1 (war 类型,依赖 webcommon)
`-- PM-Client2 (war 类型,取决于 webcommon)

并在 PM-Client1 和 PM-Client2 中使用覆盖将它们与 PM-WebCommon 和包战争“合并”到每个客户端。

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

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

于 2010-01-14T14:04:12.087 回答
1

Compare also the answers for question different WAR files, shared resources .

于 2010-01-14T16:32:52.920 回答
1

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

或者你可以看看使用maven 程序集插件

于 2010-01-14T13:42:04.127 回答