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

Posted

技术标签:

【中文标题】如何包含父 Spring 项目(使用 Git 子模块)?【英文标题】:How to include a parent Spring project (using Git submodule)? 【发布时间】:2011-01-20 23:14:59 【问题描述】:

我目前正在使用 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 内部更改 bases 代码,并且还能够使用 webapp`s 目录中的 mvn package 构建每个 webapp 的功能齐全的 WAR。

Maven 的parentmodule 不允许这样的动态方法。我根本没有找到像这样使用module 的方法,而使用parent 来满足我的需求是复杂且静态的:对base 的每次更改都需要将新版本推送到存储库,以便webapp `s 可以继承它。

也许我没有完全理解 Maven 的继承,但我现在很迷茫。

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

【问题讨论】:

只是一个简单的JAR,需要打包成WAR文件吗? 不,不是。如上所述,我还想包含某种“元构建配置”。使用父 POM 可以实现什么。有些任务必须为所有项目执行,我不想复制和粘贴它们。 【参考方案1】:

您的用例似乎是 overlays 的一个很好的用例(也请查看 the examples)。

叠加层用于跨多个 Web 应用程序共享公共资源。通常,WAR 项目的所有依赖项都收集在 WEB-INF/lib 中,但覆盖在 WAR 源上的 WAR 工件除外。

但是 base 不会在 webapp 模块“下”,它很可能是一个兄弟模块(也许它可以使用一些 Git 黑魔法“在”webapp 中,但这超出了我的 Git 技能,但我没有想到如何用 Maven 处理这个问题)。不,真的,我认为 Maven 的方式是使用覆盖。如果这不是你想要的,最好使用 Maven IMO 以外的其他东西。

【讨论】:

这似乎比我使用 parent 完成的 Maven 继承更好。但它缺乏,嗯,继承。将两者结合起来会导致类似的臃肿配置,没有动态和对智能 Git 工作流程的支持。似乎 Maven 与 Git(尤其是 Git 子模块)的配合不太好。我已经在研究替代方案,并且如前所述,我愿意接受建议。 @Koraktor Maven 与 Maven 配合得很好,你必须遵守它的规则。 Maven 无法实现您想要做的事情:您不能从没有 pom 包装的项目继承(我不明白为什么您需要在 webappX 和基本 BTW 之间进行继承)。您需要在这里完全可配置的东西,即 Ant+Maven Ant 任务或 Ant+Ivy(我猜您不想编译“基础”两次,您需要自定义构建逻辑)。但老实说,我看到的更多是你失去的东西,而不是你通过“智能 Git 工作流程”赢得的东西。【参考方案2】:

我自己找到了一个可行的解决方案。

我的问题的基本解决方案是<parent> 元素的一个小子元素,称为<relativePath>。它允许在指定目录中搜​​索父 POM。否则,您总是需要先部署一个新版本,然后才能在您的应用程序中对其进行测试。

<parent>
    <groupId>com.example</groupId>
    <artifactId>base</groupId>
    <version>1.0.0</groupId>
    <relativePath>base</relativePath>
</parent>

但这只是起点,允许使用 Git 子模块。为了让它真正发挥作用,我需要执行以下操作:

使用来自 webapp 和 base 的类和资源创建一个 WAR,即里面的所有文件

base/src/main/java
base/src/main/resources
base/src/main/webapp
src/main/java
src/main/resources
src/main/webapp

虽然资源很容易覆盖,但需要对 org.apache.maven.plugin:maven-war-plugin 进行一些配置才能将 webapp 资源放入 WAR。编译两个不同的源文件夹需要一个插件,所以我需要使用org.codehaus.mojo:build-helper-maven-pluginbase的类放到WAR中。

此外,我对资源进行了大量过滤,因此几乎不需要自定义基本文件即可启动和运行 webapp。例如,我在我的主模板文件中使用$project.artifactId,所以我的html &lt;head&gt; 对于一个名为webapp1 的webapp 看起来像这样:

<link href="stylesheets/base.css" rel="stylesheet" media="screen" type="text/css" />
<link href="stylesheets/webapp1.css" rel="stylesheet" media="screen" type="text/css" />

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

【讨论】:

以上是关于如何包含父 Spring 项目(使用 Git 子模块)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 模块的多个 git 分支?

使用 git 子模块恢复 Nuget 包

如何在@ManyToOne 单向映射中使用spring boot 保存包含子对象的父对象?

AWS Elastic Beanstalk + Git 子模块

git基础教程(36)submodule 子模块的管理和使用

Git 子模块 - submodule