如何包含父Spring项目(使用Git子模块)?

时间:2010-02-25 11:15:03

标签: git spring maven-2 build-process ivy

我目前正在使用Spring开发多个Web应用程序。我正在使用Maven进行构建,使用Git进行版本控制。目前我正试图找到一种方法来拆分所有webapps使用的一些东西的开发,例如我有一些助手类对所有项目都是一样的。问题是,我不想只使用类,而是使用资源文件和某种父POM,同时仍然独立于存储库并且能够从Git中受益。

虽然我并不热衷于改变构建系统,但我并不是Maven的真正粉丝。特别是继承和聚合的概念现在正在限制我。也许常春藤是一种选择?

我想快速概述一下我的设置:

有一些父项目,包括一些类,Spring配置文件和其他资源,如模板,图像和样式表。我们称之为base。这个不是一个完整的Spring webapp,不会被部署。还有其他几个base继承的项目,应该打包到WAR中。我们称他们为webapp1webapp2

basewebapp1webapp2拥有自己的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的parentmodule不允许像这样的动态方法。我根本没有找到像这样使用module的方法,并且使用parent来满足我的需求是复杂和静态的:对base的每次更改都需要将新版本推送到存储库,以便webapp可以继承它。

也许我并没有完全理解Maven的遗产,但我现在很失落。

有没有人取得类似的成功?你使用了什么构建系统以及如何使用?

2 个答案:

答案 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-pluginorg.codehaus.mojo:build-helper-maven-plugin的类放入WAR中。

  • 此外,我对资源进行了大量过滤,因此几乎不需要自定义基本文件来启动和运行Web应用程序。例如,我在主模板文件中使用base,因此对于名为${project.artifactId}的网络应用,我的HTML <head>看起来像这样:

    webapp1

它真的花了很多试验和错误,但最后我得到了它的工作,我认为这是使用Maven实现目标的最佳方法。使用像Buildr这样的动态工具会更容易,但遗憾的是Buildr在Windows上很慢(感谢Ruby)并且不能很好地集成到大多数IDE中。