如何包含父 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 中。我们称他们为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
s 代码,并且还能够使用 webapp`s 目录中的 mvn package
构建每个 webapp 的功能齐全的 WAR。
Maven 的parent
或module
不允许这样的动态方法。我根本没有找到像这样使用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-plugin
将base
的类放到WAR中。
此外,我对资源进行了大量过滤,因此几乎不需要自定义基本文件即可启动和运行 webapp。例如,我在我的主模板文件中使用$project.artifactId
,所以我的html <head>
对于一个名为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 子模块)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在@ManyToOne 单向映射中使用spring boot 保存包含子对象的父对象?
AWS Elastic Beanstalk + Git 子模块