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

时间:2012-04-07 09:20:44

标签: maven module

我一直在研究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桥模块在一次的子目录?

这甚至可能与Maven,或者我有包装,每次部署的myproject桥到回购我做一个好办法呢?也许我错了,但这似乎是一个如此平常的问题,但似乎没有人在谈论它。我是不是错了?

4 个答案:

答案 0 :(得分:5)

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

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

但这种方法的结果是你需要一个单独的项目,其中包含这个api。这可以通过使用IDE来简化,该IDE通过工作空间而不是存储库来解决项目之间的依赖关系。否则,您需要定期执行mvn安装(如果您只在本地工作)或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中你只需定义

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

并在myproject-b中以同样的方式。 您必须意识到使用模块并不一定意味着定义依赖项。这使您还有机会在发布后或作为SNAPSHOT从完整的不同项目中使用myproject-bridge。

答案 1 :(得分:3)

如果我们在标题中提出问题,那么问题是:

  

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

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

如上面的matsev's answer所示,“列出的每个模块都是相对路径到包含模块(强调添加)的目录。”它不一定是一个子目录,只要它是来自超级项目的相对路径(我避免使用术语“父”和“子”,以免涉及不相关的继承概念项目)到子项目。可以以可能依赖于OS的各种方式满足该约束。例如,您可能包括父目录路径元素(..)以遍历到子模块目录。或者,您可以使用符号链接。无论如何,不​​,Maven模块必须是Maven多模块项目目录的子目录并不严格。

答案 2 :(得分:2)

来自Maven schema descriptor

中的文档
  

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

答案 3 :(得分:0)

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

要共享您的网络项目,您必须将其部署在您的存储库中,这样其他两个就可以依赖它。

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

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

因此,在读取存储库时,Eclipse会将mybridge依赖性与Eclipse工作区中的依赖性链接起来。

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

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

问候。