2

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

尽管我不热衷于更改构建系统,但我并不是 Maven 的真正粉丝。尤其是继承和聚合的概念是我现在的束缚。也许常春藤是一个选择?

我想简要介绍一下我的设置:

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

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)

我希望能够base使用 Git 子模块从 webapps 内部更改 s 代码,并且还能够使用 webappmvn package的目录内构建每个 webapp 的功能齐全的 WAR。

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

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

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

4

2 回答 2

1

您的用例似乎是覆盖的一个很好的用例(另请查看示例)。

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

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

于 2010-02-25T16:36:01.080 回答
0

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

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

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

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

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

    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>对于一个名为的 webapp 看起来像这样webapp1

    <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 中。

于 2010-03-04T12:34:23.903 回答