Maven安装传递依赖项

时间:2016-04-11 21:36:08

标签: java eclipse maven maven-install-plugin

我有一个项目,我需要在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的依赖,但事实并非如此。

2 个答案:

答案 0 :(得分:10)

  

毕竟,应该是Maven应该获得libA的依赖,但事实并非如此。

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

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

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

来自官方Maven - Introduction to the dependency mechanism

  

通过从指定的远程存储库中读取依赖项的项目文件,可以简化此功能。通常,这些项目的所有依赖项都在项目中使用,项目从其父项或其依赖项继承的任何依赖项都是如此。

注意:大胆是我的。 项目文件通常是pom.xml文件,一旦相关工件上传到Maven存储库(或安装到本地Maven缓存中),就会重命名为*.pom文件。

根据您的问题,您使用了-DgeneratePom=true,因此您没有通过libA'pom.xml文件,但是新文件是automatically generated

  

如果没有通过参数pomFile提供,则为工件生成最小POM。如果本地存储库中还没有现有POM,则默认为true

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

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

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

进一步阅读SO:

答案 1 :(得分:-1)

这可能会对您有所帮助:

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