7

我一直在研究 Maven 中的多模块项目,我只能找到作为父项目的子目录存在的模块示例。我是否会错误地推断出没有办法在两个 maven 项目之间共享一个模块而不必将其打包并将其部署到存储库?这会让我觉得不必要的麻烦。

例如,假设我正在积极从事两个相关的项目,除了通过我正在研究的 API 桥之外,它们彼此之间不交流,我打算将其用于未来的事情。随着这两个项目的工作进展,这座桥会不断更新。

所以,如果我想利用 Maven 模块来完成这项工作,一个项目 pom.xml 看起来像这样......

<groupId>net.syndog</groupId>
<artifactId>myproject</artifactId>
.
.
.
<modules>
    <module>myproject-bridge</module>
</modules>

...另一个看起来像这样...

<groupId>net.syndog</groupId>
<artifactId>myotherproject</artifactId>
.
.
.
<modules>
    <module>myproject-bridge</module>
</modules>

假设 Maven 中的模块必须是它们所在项目的子目录,那么 myproject 和 myotherproject 如何同时使用 myproject-bridge 模块?

这甚至可以使用 Maven,还是每次我对其进行调整时都必须打包并将 myproject-bridge 部署到存储库?也许我错了,但这似乎是一个司空见惯的问题,但似乎没有人在谈论它。我对这一切都错了吗?

4

4 回答 4

6

使用这种依赖项的通常方法是定义一个依赖项,结果如下:

<dependency>
  <groupId>net.syndog</groupId>
  <artifactId>xyz-api</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

但是这种方法的结果是你需要一个单独的项目,其中包含这个 api。这可以通过使用 IDE 来简化,该 IDE 通过工作区而不是存储库来解决项目之间的依赖关系。否则,您需要定期执行 mvn install(如果您仅在本地工作)或 mvn deploy(通过存储库管理器)。

另一种解决方案是使用一个真正的多模块项目,如下所示:

+-- pom.xml (root)
+-- myproject-bridge
     +--- pom.xml
+-- myproject-a
     +--- pom.xml
+-- myproject-b
     +--- pom.xml

其中 project-a 和 project-b 通过简单的依赖项使用 myproject-bridge。在根目录中,您通过以下方式定义模块(如您所述)

<modules>
 <module>myproject-bridge</module>
 <module>myproject-a</module>
 <module>myproject-b</module>
</modules>

在 myproject-a 中,您只需定义

<dependency>
  <groupId>net.syndog</groupId>
  <artifactId>xyz-api</artifactId>
  <version>${project.version}</version>
</dependency>

并在 myproject-b 中以同样的方式。您必须知道,使用模块并不一定意味着定义依赖项。这也使您有机会在发布后或作为 SNAPSHOT 使用来自完全不同项目的 myproject-bridge。

于 2012-04-07T11:08:51.327 回答
6

如果我们把这个问题放在标题中,那么问题是这样的:

Maven 模块是否必须是父项目的子目录?

只要问题是关于 Maven 多模块项目而不是 Maven 继承项目,那么该问题的答案就是“否”。这就是为什么。

正如matsev上面的回答清楚地表明,“列出的每个模块都是包含该模块的目录的相对路径(强调添加)。” 它不必是子目录,只要它是超级项目(我避免使用术语“父”和“子”以免涉及继承项目的无关概念)到子项目的相对路径即可. 可以通过多种可能依赖于操作系统的方式来满足此约束。例如,您可能包含父目录路径元素 (..) 以遍历子模块目录。或者,您可以使用符号链接。在任何情况下,不,Maven 模块必须是 Maven 多模块项目目录的子目录并不是严格意义上的。

于 2014-11-01T15:09:51.877 回答
4

Maven 模式描述符中的文档:

作为该项目的一部分构建的模块(有时称为子项目)。列出的每个模块都是包含该模块的目录的相对路径。

于 2012-04-07T13:22:46.677 回答
0

据我所知,模块必须位于父项目的子目录中。

要共享您的桥接项目,您必须将其部署在您的存储库中,以便其他两个可以依赖它。

如果您正在使用 Eclipse,此解决方法将帮助您。

  • 在您的工作区中安装 3 个项目。
  • 确保所有项目都声明为 Maven 项目。
  • 对于这两个项目,添加 mybridge 作为依赖项。
  • 对于这两个项目,右键单击他们的项目,然后选择 Maven --> 启用工作区解析。

因此,Eclipse 会将 mybridge 依赖关系与 Eclipse 工作区中的依赖关系链接起来,而不是读取您的存储库。

每次更改 mybridge 时,其他两个项目都会受到影响。

也许有更好的方法,我不是 Maven 最大的专家。

问候。

于 2012-04-07T11:06:09.600 回答