添加Maven依赖项时会发生什么?

时间:2015-04-13 20:55:23

标签: java maven oop build build-process

当我向pom.xml文件添加依赖项并使用“mvn package”构建时,Maven采用该依赖项代码采取了哪些步骤?

它是否物理地从该依赖项的包中获取java代码并将其放入JAR中?为什么我需要添加依赖...为什么Maven不能只查看我的import语句和完全限定的名称并找出我需要哪些依赖项?

5 个答案:

答案 0 :(得分:7)

一般来说,在所有pom.xml中我们都发现了这样的依赖 -

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

此处groupIdartifactIdversion是3个密钥,通过这些密钥唯一标识jar。这三种组合的工作方式类似于使用x,y和z坐标唯一识别空间中点的坐标系。

每当您发出mvn package命令maven时,都会尝试将依赖项指示的jar文件添加到构建路径中。为此,maven遵循以下步骤 -

  1. 在本地存储库中进行Maven搜索(对于linux,默认为〜/ .m2)。如果在此处找到依赖项/ jar,则将jar文件添加到构建路径。之后,它使用jar中所需的类文件进行编译。

  2. 如果在〜/ .m2中找不到依赖关系,那么它将分别查找您的本地私有存储库(如果您已经使用setting.xml文件配置了任何文件)和maven中央远程存储库。如果您没有任何本地私有存储库,那么它将直接转到maven中央远程存储库。

  3. 每当在本地/远程存储库中找到jar时,都会将其下载并保存在〜/ .m2中。

  4. 接下来,当您再次发出mvn package命令时,它永远不会搜索到任何存储库的依赖关系,因为它已经存在于您的~/.m2中。

答案 1 :(得分:4)

如果你只有默认superpom的标准maven插件,添加依赖项将:

  • 将指定版本下载到本地存储库
  • 用它来编译
  • 使用它来运行测试

有几个maven插件可用于在包中包含依赖项。其中包括:

  • 行家-战争插件
  • 行家入耳式插件
  • 行家组装-插件
  • appassembler-行家-插件

此外,maven-shade-plugin可用于将您的依赖项组合到您自己代码的jar文件中。

除非您将它们添加到您的pom中,否则不会使用这些。

答案 2 :(得分:2)

依赖关系允许您使用maven下载第三方库。

 <dependencies>
    <!--    Spring dependency -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.1.5.RELEASE</version>
    </dependency>
</dependencies>
例如,它将在你的maven依赖项下导入spring-core-4.1.5.RELEASE.jar。使用maven更新项目后。然后,您就可以在代码中使用此jar。

  

为什么Maven只能查看我的import语句并完全合格   命名并找出我需要哪些依赖项?

因为有两个不同罐子重载的方法相同怎么办? Maven无法确定要导入哪一个。好的例子是hibernate和JPA注释。他们相似,但使用不同的进口。

答案 3 :(得分:1)

Maven会将新的依赖项下载到您的本地存储库,然后使用它来编译您的JAR。

如果要将应用程序打包为Web存档(WAR文件),它将在WAR文件中包含依赖项的二进制文件(以及它所依赖的任何二进制文件)。

答案 4 :(得分:1)

  1. mvn package获取项目中的任何已编译代码,并将其置于其分发形式中。如果您的打包格式为jar,则maven将根据mvn package调用构建您项目的jar文件。

  2. Maven是否在项目之外抓取二进制文件取决于打包类型。 jar包类型仅包装您正在构建的项目的本地代码,并且不会从外部项目中获取二进制文件,但其他打包方法可能会有不同的行为。

  3. 您需要首先定义依赖项,因为Maven管理同一名称空间的多个版本。例如,您可以指定类似import org.jfree.JFreeChart;的内容,但仅从此语句中,Maven不知道您是否需要JFreeChart版本1.0.16或1.0.17,这就是您需要指定的原因它在POM文件中。