Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何包含父Spring项目(使用Git子模块)?_Git_Spring_Maven 2_Build Process_Ivy - Fatal编程技术网

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

如何包含父Spring项目(使用Git子模块)?,git,spring,maven-2,build-process,ivy,Git,Spring,Maven 2,Build Process,Ivy,我目前正在使用Spring开发多个web应用程序。我使用Maven进行构建,使用Git进行版本控制。目前,我正试图找到一种方法来拆分所有Web应用程序使用的某些东西的开发,例如,我有一些对所有项目都相同的帮助器类。问题是,我不想只使用类,还要使用资源文件和某种父POM,同时仍然独立于存储库并能够从Git中获益 虽然我不热衷于改变构建系统,但我不是Maven的真正粉丝。特别是继承和聚合的概念是目前制约我的因素。也许常春藤是一种选择 我想让您快速了解一下我的设置: 有一些父项目,包括一些类、Spri

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

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

我想让您快速了解一下我的设置:

有一些父项目,包括一些类、Spring配置文件和其他资源,如模板、图像和样式表。让我们称之为
base
。这不是一个完整的SpringWebApp,不会被部署。还有其他几个项目继承自
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目录中的
mvn包构建每个webapp的全功能WAR

Maven的
父级
模块
不允许这样的动态方法。我根本没有找到像那样使用
模块
的方法,而使用
父级
满足我的需求是复杂的和静态的:对
基础
的每次更改都需要将新版本推送到存储库中,以便webapp可以从中继承

也许我没有完全理解Maven的遗产,但我现在很迷茫


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

您的用例似乎是一个很好的用例(也可以查看一下)

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


但是base不会“在”webapp模块下,它很可能是一个兄弟模块(也许它可以“在”webapp中使用一些Git黑魔法,但这超出了我的Git技能,我无法思考如何用Maven处理它)。不,真的,我认为Maven的方法是使用覆盖层。如果这不是您想要的,最好使用Maven IMO以外的其他工具。

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

我的问题的基本解决方案是
元素的一个子元素
。它允许在指定目录中搜索父POM。否则,在应用程序中测试新版本之前,您将始终需要部署新版本

<parent>
    <groupId>com.example</groupId>
    <artifactId>base</groupId>
    <version>1.0.0</groupId>
    <relativePath>base</relativePath>
</parent>
虽然资源很容易覆盖,但是需要对
org.apache.maven.plugin:maven-war-plugin
进行一些配置,以便将webapp资源引入到war中。编译两个不同的源文件夹需要一个插件,因此我需要使用
org.codehaus.mojo:buildhelpermaven-plugin
base
类引入到WAR中

  • 此外,我对资源使用了大量过滤,因此几乎不需要定制基本文件来启动和运行webapp。例如,我在主模板文件中使用了
    ${project.artifactId}
    ,因此对于名为
    webapp1
    的webapp,我的HTML
    将类似于此:

    <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在Windows上运行缓慢(多亏了Ruby),并且不能很好地集成到大多数IDE中。

    base只是一个需要打包到WAR文件中的简单JAR吗?不,不是。就像上面提到的,我还想包括一些“元构建配置”。父母POM可以实现什么。有些任务必须为所有项目执行,我不想复制和粘贴它们。这似乎比我使用
    parent
    使用Maven继承的方法更好。但它缺乏继承权。两者的结合将导致类似的臃肿配置,没有动态性和对智能Git工作流的支持。似乎Maven在Git(尤其是Git子模块)上做得不太好。我已经在调查其他的选择,就像前面说的,我愿意接受建议。@Koraktor Maven和Maven打得很好,你必须遵守它的规则。Maven不可能实现您想要的功能:您不能从没有
    pom
    打包的项目继承(我不明白为什么您需要webappX和base BTW之间的继承)。这里您需要完全可配置的东西,即Ant+Maven Ant tasks或Ant+Ivy(我想您不想编译“base”两次,您需要自定义构建逻辑)。但老实说,我看到的更多的是你通过“智能Git工作流”所失去的,而不是你所赢得的。
    <link href="stylesheets/base.css" rel="stylesheet" media="screen" type="text/css" />
    <link href="stylesheets/webapp1.css" rel="stylesheet" media="screen" type="text/css" />