7

我有一个项目,我需要在 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 添加 <dependency> 时,Maven 没有选择 libB。

问题:应该是,毕竟 Maven 应该得到 libA 的依赖,但它没有。

4

2 回答 2

16

应该是,毕竟 Maven 应该得到 libA 的依赖,但它没有。

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

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

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

来自官方Maven——依赖机制介绍

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

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


根据您的问题,您使用-DgeneratePom=true了 ,因此您没有传递 libA'文件,而是自动生成pom.xml了一个新文件

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

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


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

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

如需进一步阅读 SO:

于 2016-04-11T21:43:37.757 回答
-2

这可能会帮助您:

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

于 2016-04-11T21:38:15.863 回答