当我向pom.xml文件添加依赖项并使用“mvn package”构建时,Maven采用该依赖项代码采取了哪些步骤?
它是否物理地从该依赖项的包中获取java代码并将其放入JAR中?为什么我需要添加依赖...为什么Maven不能只查看我的import语句和完全限定的名称并找出我需要哪些依赖项?
答案 0 :(得分:7)
一般来说,在所有pom.xml
中我们都发现了这样的依赖 -
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
此处groupId
,artifactId
和version
是3个密钥,通过这些密钥唯一标识jar。这三种组合的工作方式类似于使用x,y和z坐标唯一识别空间中点的坐标系。
每当您发出mvn package
命令maven
时,都会尝试将依赖项指示的jar文件添加到构建路径中。为此,maven遵循以下步骤 -
在本地存储库中进行Maven搜索(对于linux
,默认为〜/ .m2)。如果在此处找到依赖项/ jar,则将jar文件添加到构建路径。之后,它使用jar
中所需的类文件进行编译。
如果在〜/ .m2中找不到依赖关系,那么它将分别查找您的本地私有存储库(如果您已经使用setting.xml
文件配置了任何文件)和maven中央远程存储库。如果您没有任何本地私有存储库,那么它将直接转到maven中央远程存储库。
每当在本地/远程存储库中找到jar时,都会将其下载并保存在〜/ .m2中。
接下来,当您再次发出mvn package
命令时,它永远不会搜索到任何存储库的依赖关系,因为它已经存在于您的~/.m2
中。
答案 1 :(得分:4)
如果你只有默认superpom的标准maven插件,添加依赖项将:
有几个maven插件可用于在包中包含依赖项。其中包括:
此外,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)
mvn package
获取项目中的任何已编译代码,并将其置于其分发形式中。如果您的打包格式为jar
,则maven将根据mvn package
调用构建您项目的jar文件。
Maven是否在项目之外抓取二进制文件取决于打包类型。 jar
包类型仅包装您正在构建的项目的本地代码,并且不会从外部项目中获取二进制文件,但其他打包方法可能会有不同的行为。
您需要首先定义依赖项,因为Maven管理同一名称空间的多个版本。例如,您可以指定类似import org.jfree.JFreeChart;
的内容,但仅从此语句中,Maven不知道您是否需要JFreeChart版本1.0.16或1.0.17,这就是您需要指定的原因它在POM文件中。