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

What happens when I add a Maven dependency?

当我将依赖项添加到 pom.xml 文件并使用 "mvn package" 构建时,Maven 使用该依赖项代码执行哪些步骤?

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

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

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

依赖项将允许您使用 maven 下载第 3 方库。

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

why can't Maven just look at my import statements and fully qualified names and figure out which dependencies I need?

因为如果两个不同的 jar 重载了相同的方法怎么办? Maven 将无法确定要导入哪一个。很好的例子是休眠和 JPA 注释。它们很相似,但使用不同的导入。

  1. mvn package 获取您在项目中拥有的任何已编译代码并将其放入其分发形式。如果您的打包格式是 jar,那么 Maven 将构建您项目的 jar 文件作为 mvn package 调用的结果。

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

  3. 首先需要定义依赖关系,因为Maven管理着同一个命名空间的多个版本。例如,您可以指定类似 import org.jfree.JFreeChart; 的内容,但仅根据此语句,Maven 不知道您想要 JFreeChart 版本 1.0.16 还是 1.0.17,这就是为什么您需要在 POM 中指定它文件.

总的来说,在所有 pom.xml 中,我们发现了这样的依赖关系 -

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

这里groupIdartifactIdversion是唯一标识一个jar的3个key。这 3 种组合的工作方式类似于坐标系,用于使用 x、y 和 z 坐标唯一标识 space 中的一个点。

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

  1. 在本地存储库中搜索 Maven(linux 的默认值为 ~/.m2)。如果在此处找到 dependency/jar,那么它会将 jar 文件添加到您的构建路径中。之后,它使用 jar 中所需的 class 文件进行编译。

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

  3. 只要在 local/remote 存储库中找到 jar,就会将其下载并保存在 ~/.m2 中。

展望未来,当您再次发出 mvn package 命令时,它永远不会搜索对任何存储库的依赖,因为它已经在您的 ~/.m2 中。

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

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

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

  • maven-war-插件
  • maven-ear-plugin
  • maven-assembly-plugin
  • appassembler-maven-插件

另外,maven-shade-plugin可以用来将你的依赖组合成你自己代码的jar文件。

None 除非您将它们添加到您的 pom 中,否则将使用它们。