Maven依赖与多模块?

时间:2014-10-27 01:10:19

标签: maven

对Maven来说很新,有人可以向我解释一下使用maven模块与仅仅将maven项目的依赖项添加到工作区中的另一个maven项目之间的区别吗?你什么时候用一个而不是另一个?

3 个答案:

答案 0 :(得分:6)

依赖项是预构建的实体。您可以从Maven Central(或Nexus等)获取该依赖项的工件。对于属于其他团队或项目的代码,通常使用依赖项。例如,假设您在Android中需要CSV库。你把它作为一种依赖。

Maven模块就像您的项目一样构建。将Maven模块用于项目所拥有的组件是很常见的。例如,您的项目可能会创建三个jar文件。

答案 1 :(得分:2)

依赖关系可以被认为是用于构建和/或运行代码的lib / jar(也就是Maven用语中的Artifact)。 此工件可以由您的多模块项目的一个模块或第三方预构建库(例如log4j)构建。

maven的一个概念是每个模块将输出一个工件(比如一个jar)。因此,在复杂项目的情况下,最好将项目拆分为多个模块。这些模块可以通过声明的依赖关系相互依赖。 有关如何将Web应用程序拆分为父模块和子模块以及它们如何链接的示例,请参阅http://books.sonatype.com/mvnex-book/reference/multimodule-sect-intro.html

答案 2 :(得分:1)

Maven最令人困惑的一个方面是,父pom可以同时充当parentaggregator

您在Maven中考虑的99%的功能都是parent pom方面,您继承了repositoriesplugins以及最重要的dependencies等内容。

依赖关系是在每次构建期间评估的lib之间的硬性,有形关系。如果您认为您的软件是一顿饭,那基本上就是A requires ingredient B

所以,假设你正在准备烤宽面条。然后你的依赖链看起来像这样:

lasagne
    <- meatSauce
        <- groundBeef
        <- tomatoPaste
    <- cheese
    <- noodles

关键是,上面的每一项(meatSause,groundBeef,cheese等)都是具有各自依赖关系的单独构建。

相比之下,您的pom中与聚合相关的唯一部分是modules部分:

<modules>
    <module>meatSauce</module>
    <module>groundBeef</module>
    <module>tomatoPaste</module>
    <module>cheese</module>
    <module>noodles</module>
</modules>

聚合只是告诉你的构建引擎它应该快速连续运行这5个构建:

groundBeef -> tomatoPaste -> cheese -> noodles -> meatSauce

聚合的主要好处是方便(只需点击构建一次)并确保构建的顺序正确(例如,您不希望在tomatoPaste之前构建meatSauce)。

但事情就是这样:即使您将libs组织为没有module聚合的独立项目,只要您按照正确的顺序构建,您的构建仍然会相同。

此外,如果依赖项目发生了变化,Jenkins和Eclipse都有触发构建的机制(例如,更改groundBeef会自动触发meatSauce)。

因此,如果您正在构建Jenkins或Eclipse,则无需聚合