题
我设置了以下 Maven 项目:
- PM-核心
- PM-Web(依赖于 PM-Core)
我一直在考虑如何使用 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-73 和 MWAR-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文件,共享资源 .