当前位置: 首页 > 知识库问答 >
问题:

在可传递依赖项中忽略Maven dependencyManagement版本

海岳
2023-03-14

Maven正在过渡地使用guava的第16版,尽管我有一个

快速总结:

  • gwizard示例取决于gwizard配置
  • gwizard-config有一个父pom,gwizard-parent
  • gwizard父级

谢天谢地,这是一个开源项目,因此您可以直接看到POM:gwizard父项、gwizard配置、gwizard示例。但是,以下是gwizard parent中的重要一点:

<properties>
    <guava.version>18.0</guava.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

...和gwizard示例中声明的无装饰依赖关系:

<properties>
    <gwizard.version>0.5</gwizard.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.gwizard</groupId>
        <artifactId>gwizard-config</artifactId>
        <version>${gwizard.version}</version>
    </dependency>
</dependencies>

gwizard配置的依赖关系树正确显示了guava 18:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-config ---
[INFO] org.gwizard:gwizard-config:jar:0.5
[INFO] +- com.google.inject:guice:jar:4.0-beta5:compile
[INFO] |  \- com.google.guava:guava:jar:18.0:compile

但是,gwizer-form的依赖树显示了guava 16(这会导致问题):

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-example ---
[INFO] org.gwizard:gwizard-example:jar:1.0-SNAPSHOT
[INFO] +- org.gwizard:gwizard-config:jar:0.5:compile
[INFO] |  +- com.google.inject:guice:jar:4.0-beta5:compile
[INFO] |  |  \- com.google.guava:guava:jar:16.0.1:compile

这是使用Maven v3.2.5。我莫名其妙。帮忙?

可能相关:忽略父级中的dependencyManagement

更新:github上链接的POM正在更改;在gwizard示例中向gwizard服务添加依赖项(直接声明guava dep)“修复”了该问题。这里仍然有一些不好的潜在行为。

更新:创建此JIRA问题


共有2个答案

呼延烈
2023-03-14

在这种情况下,Maven无法解决版本传递依赖性问题。

这个问题可以通过使用maven bom概念来解决。

检查maven留档bom在下面的链接http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management

这里是另一个解释bomhttp://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/用法的博客

为了解决这个问题,您需要在项目gwizard示例的dependencyManagement部分添加以下依赖项。

     <dependency>
         <groupId>org.gwizard</groupId>
         <artifactId>gwizard-parent</artifactId>
         <version>${gwizard.version}</version>
         <type>pom</type>
         <scope>import</scope>
     </dependency>
黄德明
2023-03-14

有一件事很简单。dependencManagement不声明实际使用的依赖项,它只定义可以使用的版本等。

如果您定义这样的内容,则不会导致更改。

<properties>
    <guava.version>18.0</guava.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

如果你真的想覆盖你树中使用的版本,你需要定义一个真正的依赖关系:所以基于上面的定义,你还需要添加以下内容:

<dependencies>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
    </dependency>
</dependencies>

如果您已添加此项,请稍后通过mvn dependency:tree进行检查。

 类似资料:
  • 我有一个war项目(项目a)对另一个包含共享库的项目(项目B)有编译依赖关系,但是我不希望在WTP部署中包含项目B的可传递依赖关系。 当我使用gradle生成war文件时,来自Project B的可传递依赖项会被忽略,但WTP一直将所有库复制到/WEB-INF/lib目录中,因此我遇到了类加载器问题。 我试图在依赖关系和配置级别上使用忽略Project B中的可传递依赖关系,并使用忽略特定的依赖关

  • 我用我的真实情况来说明问题。 我使用logback 1.0.1进行日志记录,它包含SLF4J 1.6.4作为依赖项。我还为遗留日志API(Java . util . logging、log4j和commons-logging)使用SLF4J API桥,它们不是显式的依赖关系。这些也必须(最好)是版本1.6.4。 为了使我的pom.xml尽可能整洁和无错误,我想强制这些API桥接器与SLF4J版本相

  • 我试图在自定义异常处理程序(用@ExceptionHandler和@ControllerAdvice注释)中的一个方法中返回“ResponseEntity”时遇到问题,我是从“doOnError”(rxjava)调用这个方法的,但我的问题是,当我这样做时,不仅调用了我的方法,还调用了@ControllerAdvice注释类中的另一个@ExceptionHandler,但该类不在我的项目中,而是在我

  • 我刚刚将我的项目升级到gradle 7,并且遇到了缺失的可传递依赖项。我试着改变我的身材。gradle文件在依赖项中使用“api”,但这并没有修复它。 projectA依赖于projectB,projectB依赖于projectC。 projectA-build。格拉德尔 projectB-构建。格拉德尔 ProjectA编译良好,但有运行时错误-从project ectC获取类的ClassNot

  • 我给ivy添加了一个依赖项(我们称之为a)。在maven central中具有pom文件的xml。Ivy使用ibiblio来解析maven依赖项。添加到常春藤中的依赖项(A)。xml具有可传递依赖项(B)。到目前为止,一切都很好。传递依赖(B)的依赖(C)不能用常春藤来解决。 我在常春藤上定义了一个新的名字。如下所示的xml: 在B的pom文件中,C在编译和测试范围中定义如下: 当我在ivy的缓存

  • 我创建了一个Maven项目(可重用库),该项目有许多依赖项(编译时和运行时),它们也可以过渡地依赖于其他许多依赖项。在maven中,我可以在pom中添加依赖项。xml及其可传递依赖关系将自动处理。所以,我将毫无问题地运行。 现在,我有一个非Maven(基于Ant的)项目,上面创建的库(Maven Lib)将使用它。 在这种情况下,运行时间