我目前正在使用Spring开发多个Web应用程序。我正在使用Maven进行构建,使用Git进行版本控制。目前我正试图找到一种方法来拆分所有webapps使用的一些东西的开发,例如我有一些助手类对所有项目都是一样的。问题是,我不想只使用类,而是使用资源文件和某种父POM,同时仍然独立于存储库并且能够从Git中受益。
虽然我并不热衷于改变构建系统,但我并不是Maven的真正粉丝。特别是继承和聚合的概念现在正在限制我。也许常春藤是一种选择?
我想快速概述一下我的设置:
有一些父项目,包括一些类,Spring配置文件和其他资源,如模板,图像和样式表。我们称之为base
。这个不是一个完整的Spring webapp,不会被部署。还有其他几个从base
继承的项目,应该打包到WAR中。我们称他们为webapp1
和webapp2
。
base
,webapp1
和webapp2
拥有自己的Git存储库:
\
|
|- base.git (base's repository)
|
|- webapp1.git (webapp1's repository)
| \
| base (base used as a Git submodule)
|
|- webapp2.git (webapp2's repository)
\
base (base used as a Git submodule)
我希望能够使用Git子模块从webapps内部更改base
代码,并且还能够使用webapp中的mvn package
构建每个webapp的完整功能WAR 。目录
Maven的parent
或module
不允许像这样的动态方法。我根本没有找到像这样使用module
的方法,并且使用parent
来满足我的需求是复杂和静态的:对base
的每次更改都需要将新版本推送到存储库,以便webapp可以继承它。
也许我并没有完全理解Maven的遗产,但我现在很失落。
有没有人取得类似的成功?你使用了什么构建系统以及如何使用?
答案 0 :(得分:0)
您的用例似乎是overlays的一个很好的用例(另请参阅the examples)。
覆盖用于跨多个Web应用程序共享公共资源。通常,WAR项目的所有依赖项都在WEB-INF / lib中收集,但WAR源上覆盖的WAR工件除外。
但是 base 不会在webapp模块的“下面”,它很可能是一个兄弟模块(也许它可以“使用一些Git黑魔法”在webapp中“但是这超出了我的Git技能并没有考虑如何用Maven处理这个问题。不,真的,我认为Maven的方式是使用叠加层。如果这不是你想要的,那么最好使用Maven IMO以外的东西。
答案 1 :(得分:0)
我自己找到了一个有效的解决方案。
我的问题的基本解决方案是名为<parent>
的{{1}}元素的一个小子元素。它允许在指定目录中搜索父POM。否则,您需要先部署新版本,然后才能在应用程序中对其进行测试。
<relativePath>
但这只是一个起点,允许使用Git子模块。为了让它真正起作用,我需要做以下事情:
使用webapp和<parent>
<groupId>com.example</groupId>
<artifactId>base</groupId>
<version>1.0.0</groupId>
<relativePath>base</relativePath>
</parent>
创建一个包含类和资源的WAR,即
base
虽然资源很容易覆盖,但需要对base/src/main/java
base/src/main/resources
base/src/main/webapp
src/main/java
src/main/resources
src/main/webapp
进行一些配置才能将webapp资源放入WAR中。编译两个不同的源文件夹需要一个插件,因此我需要使用org.apache.maven.plugin:maven-war-plugin
将org.codehaus.mojo:build-helper-maven-plugin
的类放入WAR中。
此外,我对资源进行了大量过滤,因此几乎不需要自定义基本文件来启动和运行Web应用程序。例如,我在主模板文件中使用base
,因此对于名为${project.artifactId}
的网络应用,我的HTML <head>
看起来像这样:
webapp1
它真的花了很多试验和错误,但最后我得到了它的工作,我认为这是使用Maven实现目标的最佳方法。使用像Buildr这样的动态工具会更容易,但遗憾的是Buildr在Windows上很慢(感谢Ruby)并且不能很好地集成到大多数IDE中。