Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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
Maven模块必须是父项目的子目录吗?_Maven_Module - Fatal编程技术网

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

Maven模块必须是父项目的子目录吗?,maven,module,Maven,Module,我一直在研究Maven中的多模块项目,我只能找到作为父项目子目录存在的模块的示例。我是否会错误地推断,如果不将模块打包并部署到存储库,就无法在两个maven项目之间共享模块?那会让我觉得不必要的麻烦 例如,假设我正在积极地进行两个相关的项目,除了通过我正在进行的一个API桥接器(我计划用于未来的事情)之外,它们不会相互交谈。随着这两个项目的进展,大桥不断更新 所以,如果我想利用Maven模块来完成这项工作,一个项目pom.xml应该是这样的 <groupId>net.syndog&l

我一直在研究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>
net.syndog
我的项目
.
.
.
myproject桥
…另一个看起来像这样

<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>
net.syndog
myotherproject
.
.
.
myproject桥
假设Maven中的模块必须是它们所属项目的子目录,myproject和myotherproject如何同时使用myproject桥接模块


这在Maven中是可能的,还是每次我对myproject bridge进行调整时都必须将其打包并部署到repo中?也许我错了,但这似乎是一个很平常的问题,但似乎没有人在谈论它。我这样做完全错了吗?

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

要共享您的bridge projet,您必须将其部署到存储库中,以便其他两个项目可以依赖它

如果您正在使用Eclipse,此解决方案将使您受益匪浅

  • 在您的工作区中有3个项目
  • 确保所有项目都声明为Maven项目
  • 对于这两个项目,将mybridge添加为依赖项
  • 对于这两个项目,右键单击projet,然后选择Maven-->启用工作区解析
所以,Eclipse将把mybridge依赖性和Eclipse工作区中的依赖性链接起来,而不是读取您的存储库

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

也许有更好的办法,我不是Maven的专家


关于。

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

<dependency>
  <groupId>net.syndog</groupId>
  <artifactId>xyz-api</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>
其中project-a和project-b通过一个简单的依赖关系使用myproject桥。在根目录中,通过


myproject桥
myproject-a
myproject-b
在myproject-a中,您只需定义

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

net.syndog
xyz api
${project.version}
在myproject-b中也是如此。
您必须知道,使用模块并不一定意味着定义依赖项。这也使您有机会在发布后或作为快照从一个完全不同的项目中使用myproject桥接器。

中的文档:

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


如果我们认为问题是标题中的问题,那么问题是:

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

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

如上所述,“列出的每个模块都是包含模块的目录的相对路径(添加了强调)。”只要它是从超级项目到子项目的相对路径(我避免使用术语“父”和“子”,以免涉及继承项目的无关概念),它就不必是子目录。可以通过多种方式满足此约束,这些方式可能依赖于操作系统。例如,您可以包括父目录路径元素(..)以遍历到子模块目录。或者,您可以使用符号链接。在任何情况下,不,Maven模块必须是Maven多模块项目目录的子目录这一点严格来说是不正确的