我一直在研究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桥到回购我做一个好办法呢?也许我错了,但这似乎是一个如此平常的问题,但似乎没有人在谈论它。我是不是错了?
答案 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)
作为此项目的一部分构建的模块(有时称为子项目)。列出的每个模块都是包含模块的目录的相对路径。
答案 3 :(得分:0)
根据我的知识,模块必须位于父级项目的子目录中。
要共享您的网络项目,您必须将其部署在您的存储库中,这样其他两个就可以依赖它。
如果您正在使用Eclipse,这个解决方法将帮助您。
因此,在读取存储库时,Eclipse会将mybridge依赖性与Eclipse工作区中的依赖性链接起来。
每次更改mybridge时,其他两个项目都会受到影响。
也许有更好的方法,我不是Maven的最大专家。
问候。