Maven 安装传递依赖

Maven install transitive dependencies

我有一个项目,我需要在 Maven 上安装一个库,以便我可以在所述项目上使用它。我 运行 遇到的问题是,上述库,例如 libA,本身有一个依赖项 libB,它也是第三方库。

我已使用以下代码将两者添加到我的本地存储库:

mvn install:install-file -Dfile=VerBDConverter.jar -DgroupId=verbdconverter
-DartifactId=verbdconverter -Dversion=1.00 -Dpackaging=jar -DgeneratePom=true  

对 lib 2 做了同样的事情。问题是,当我转到项目的 pom 并为 libA 添加 时,Maven 没有获取 libB。

问题: 应该是,毕竟Maven应该获取libA的依赖,但是没有。

这可能对您有帮助:

call mvn install:install-file -Dfile=sqljdbc.jar -DgroupId=com.microsoft.jdbc -DartifactId=sqljdbc1 -Dversion=1.0 -Dpackaging=jar
call mvn install:install-file -Dfile=sqljdbc4.jar -DgroupId=com.microsoft.jdbc -DartifactId=sqljdbc4 -Dversion=4.0 -Dpackaging=jar
call mvn install:install-file -Dfile=sqljdbc41.jar -DgroupId=com.microsoft.jdbc -DartifactId=sqljdbc41 -Dversion=4.1 -Dpackaging=jar

来源:https://github.com/Programmercito/osbo-framework/blob/master/libs/instala.bat

It should be, after all, Maven should get libA's dependencies, but it didn't.

不,在你的情况下,Maven 不会突然知道 libA 需要哪些传递依赖项,因为 libA 是手动安装的,并且在任何地方都没有 libB 的踪迹。

通常,传递依赖项是在 .pom 文件的 dependencies 部分中定义的依赖项,可作为已部署应用程序的一部分使用。 .pom 文件本质上是原始 pom.xml 文件的副本,重命名以反映库名称(即 artifactId-version.jar,然后是 artifactId-version.pom)。

解决依赖关系时,maven 还将检查其 .pom 文件并因此获取有关其依赖关系的信息(成为传递依赖关系)并为其构建(和获取)所需的依赖关系图(即,为每个声明的依赖项重复相同的过程)。

来自官方Maven - Introduction to the dependency mechanism

This feature is facilitated by reading the project files of your dependencies from the remote repositories specified. In general, all dependencies of those projects are used in your project, as are any that the project inherits from its parents, or from its dependencies, and so on.

注意:粗体是我的。 项目文件 通常是 pom.xml 文件,在相关工件上传到 Maven 存储库(或安装到本地 Maven 缓存)后重命名为 *.pom 文件。


根据你的问题,你使用了 -DgeneratePom=true,因此你没有传递 libA' pom.xml 文件,但是一个新文件是 automatically generated

Generate a minimal POM for the artifact if none is supplied via the parameter pomFile. Defaults to true if there is no existing POM in the local repository yet.

自动生成的 .pom 文件几乎是空的(Maven 坐标(groupId、artifactId、版本)但其中没有 dependencies 部分),因此 Maven 会将 libA 视为没有传递依赖项的库: 它找不到,也猜不到。


因此您有四种解决方案(按推荐顺序):

  • 在公司环境中,设置一个 enterprise Maven repository(如 Arifactory、Nexus 或 Apache Archivia)并正确部署这些库,或者
  • 使用 pomFile 选项重新安装 libA,或者
  • 手动将dependencies部分添加到生成的.pom文件中,并向其中添加libB,或者
  • 在您的使用者 pom.xml 文件中明确声明 libB

进一步阅读 SO:

  • Why Maven is looking for .pom file when .jar is present in the repository?