我已经设置了以下Maven项目:
我一直在考虑如何使用maven来支持这一点,但我仍然在寻找完美的解决方案。
我能想到的最佳解决方案是为每个客户端创建一个单独的maven项目(例如PM-CLIENT1,...),它只包含客户端特定的配置文件和其他java文件或jsp,....下一步是将PM-Web项目和客户端项目视为一个Web项目,这意味着:将它们组合(打包)为1个war文件,其中来自客户端项目的文件优先于PM-Web项目中的文件。 / p>
更具体:在PM-Client1上运行mvn package
将从PM-Web获取所有内容,从PM-Client1添加/替换文件,然后将其打包成单个战争。
所以问题是:如何用maven实现这个目标?
答案 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-73和MWAR-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的答案。