2012-04-07 203 views
5

我一直在研究Maven中的多模块项目,并且我只能找到作为父项目的子目录存在的模块示例。我是否会错误地推断出,没有办法在两个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桥的回购?也许我错了,但这似乎是一个普遍的问题,但似乎没有人在谈论它。我是否全部错了?

回答

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 

,其中项目一,并使用通过一个简单的依赖性的myproject桥项目-B。在根你经由

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

0

在我知道的情况下,模块必须位于父项目的子目录中。

要共享你必须将其部署到你的资料库的桥梁谟,所以这两个其他的可以有它的依赖性。

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

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

因此,读取您的资源库时,Eclipse会将mybridge依赖与Eclipse工作区中的依赖关系链接起来。

更改mybridge另外两个项目都将受到影响每次。

也许还有更好的办法,我不是在Maven中最大的专家。

问候。

2

从文档中的Maven schema descriptor

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

3

如果我们把问题是在标题,接下来的问题是这样的:

做了Maven的模块已经成为一个父项目的子目录?

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

如上matsev's answer明确指出,“列出的每个模块是一个相对路径含有模块(强调)的目录。”它不必是一个子目录,只要它是一个相对路径超级项目(为了不涉及继承项目的无关概念,我避免使用“父”和“子”这两个术语) -项目。这种约束可以通过各种方式得到满足,这些方式可能依赖于操作系统。例如,您可能包含父目录路径元素(..)以遍历子模块目录。或者,您可能会使用符号链接。在任何情况下,不,不一定Maven模块必须是Maven多模块项目目录的子目录。

相关问题