我设置了以下 Maven 项目:

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

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

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

更具体:跑步 mvn package PM-Client1 上将从 PM-Web 获取所有内容,添加/替换 PM-Client1 中的文件,然后将其打包到单个 war 中。

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

有帮助吗?

解决方案

是的,这可以通过使用来完成 叠加层. 。网页上的示例正是您所说的。

对于项目结构,您可以有这样的内容:

.
|-- 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 中使用覆盖将它们与 PM-WebCommon 进行“合并”,并为每个客户端打包 wars。

更新 我不会涵盖所有细节,但我认为用类型范围声明战争依赖 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。

其他提示

你可以使用 简介http://maven.apache.org/guides/mini/guide-building-for- different-environments.html 并使用 分类器 区分同一版本的不同构建的工件。在此设置中,您可以在父项目下为每个客户的特定定制创建额外的可选模块,即
+ 下午
++ PM 核心
++ PM-网络
++ PM-客户端1
++ PM-客户端2

或者你可以看看使用使用 Maven 组装插件

还比较问题的答案 不同的WAR文件,共享资源 .

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top