添加 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 注释。它们很相似,但使用不同的导入。
mvn package
获取您在项目中拥有的任何已编译代码并将其放入其分发形式。如果您的打包格式是 jar
,那么 Maven 将构建您项目的 jar 文件作为 mvn package
调用的结果。
Maven 是否抓取项目外部的二进制文件取决于打包类型。 jar
包类型只打包你正在构建的项目的本地代码,不会从外部项目中获取二进制文件,但其他打包方法可能有不同的行为。
首先需要定义依赖关系,因为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>
这里groupId
、artifactId
和version
是唯一标识一个jar的3个key。这 3 种组合的工作方式类似于坐标系,用于使用 x、y 和 z 坐标唯一标识 space 中的一个点。
每当您发出 mvn package
命令时,maven
都会尝试将依赖项指示的 jar 文件添加到您的构建路径中。为此,maven 遵循以下步骤 -
在本地存储库中搜索 Maven(linux
的默认值为 ~/.m2)。如果在此处找到 dependency/jar,那么它会将 jar 文件添加到您的构建路径中。之后,它使用 jar
中所需的 class 文件进行编译。
如果在 ~/.m2 中找不到依赖项,那么它会分别查找您的本地私有存储库(如果您已经使用 setting.xml
文件配置了任何存储库)和 maven 中央远程存储库.如果您没有任何本地私有存储库,那么它将直接转到 maven 中央远程存储库。
只要在 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 中,否则将使用它们。
当我将依赖项添加到 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 注释。它们很相似,但使用不同的导入。
mvn package
获取您在项目中拥有的任何已编译代码并将其放入其分发形式。如果您的打包格式是jar
,那么 Maven 将构建您项目的 jar 文件作为mvn package
调用的结果。Maven 是否抓取项目外部的二进制文件取决于打包类型。
jar
包类型只打包你正在构建的项目的本地代码,不会从外部项目中获取二进制文件,但其他打包方法可能有不同的行为。首先需要定义依赖关系,因为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>
这里groupId
、artifactId
和version
是唯一标识一个jar的3个key。这 3 种组合的工作方式类似于坐标系,用于使用 x、y 和 z 坐标唯一标识 space 中的一个点。
每当您发出 mvn package
命令时,maven
都会尝试将依赖项指示的 jar 文件添加到您的构建路径中。为此,maven 遵循以下步骤 -
在本地存储库中搜索 Maven(
linux
的默认值为 ~/.m2)。如果在此处找到 dependency/jar,那么它会将 jar 文件添加到您的构建路径中。之后,它使用jar
中所需的 class 文件进行编译。如果在 ~/.m2 中找不到依赖项,那么它会分别查找您的本地私有存储库(如果您已经使用
setting.xml
文件配置了任何存储库)和 maven 中央远程存储库.如果您没有任何本地私有存储库,那么它将直接转到 maven 中央远程存储库。只要在 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 中,否则将使用它们。