【问题标题】:netty dependency brings old versionnetty 依赖带来旧版本
【发布时间】:2022-02-14 23:52:39
【问题描述】:

我正在使用最近的 grpc-netty 依赖项。 问题是它带来了旧版本的 io.netty 依赖项(4.1.27) 我查看了 grpc-netty 项目,使用的 io.netty 依赖版本是 4.1.63。 知道让这种依赖关系带来旧版本的传递依赖关系的原因是什么吗? 谢谢

【问题讨论】:

  • 发布你的 pom.xml
  • 请显示您的完整 pom 文件...我想您或其他依赖项/bom 正在将其引入...

标签: java maven dependencies grpc dependency-management


【解决方案1】:

Maven 在选择依赖版本时不会比较版本号。它只是选择在执行广度优先搜索时遇到的第一个版本。出于这个原因,gRPC 团队强烈 recommends 使用 Maven 强制执行器 requireUpperBoundDeps 让您检测您面临的问题:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireUpperBoundDeps/>
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>

那么,解决问题有两种方法:

  1. 重新排序依赖列表或重新定义传递依赖
  2. 使用 BOM

(1) 以 Maven 的广度优先搜索为目标,以获得您希望 Maven 搜索首先“看到”的版本。例如,您可以在&lt;dependencies&gt; 中重新排序netty-handler before grpc-netty,然后Maven 将首先遇到它并在grpc-netty 的直接依赖项之前选择它的直接依赖项。当您无法重新排序以解决问题时,您可以在传递依赖项上添加显式依赖项以显式选择其版本。例如,您可以在 &lt;dependencies&gt; 中添加带有版本 4.1.51.Final 的 netty-resolver

(2) 适用于像 gRPC 和 Netty 这样的多工件项目,您确实希望各种工件的版本一致。您通常不想将netty-buffer 4.1.51.Final 与netty-codec-http2 4.1.27.Final 一起使用;你想要他们相同的版本。在这些情况下,您可以检查项目是否具有 BOM。 gRPC 和 Netty 都有 BOM。使用 BOM,您可以为该项目中的所有各种工件选择一次使用的版本。 BOM 在&lt;dependencyManagement&gt; 部分中定义,该部分与&lt;dependencies&gt; 不同。

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-bom</artifactId>
        <version>4.1.51.Final</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    ...

无论做什么,都不要排斥。排除在以后会导致依赖问题,因为它们隐藏了传递依赖。如果较新版本的 gRPC 依赖于 较新 版本的 Netty,那么您最终会降级 Netty。到那时,构建工具将无法检测或管理问题;您只会在运行时发现此类问题。

从您所展示的内容中可以清楚地看出,您的 pom.xml 中还有更多内容;你真的需要分享更多你的 pom 来诊断。但是,由于其他答案告诉您要排除,我想展示更合适的解决方法。

【讨论】:

    【解决方案2】:
    <dependency>
        <groupId>xxx</groupId>
        <artifactId>xxx</artifactId>
        <exclusions>
           <exclusion>
             <groupId>io.netty</groupId>
             <artifactId>netty-codec-http2</artifactId>
           </exclusion>
        </exclusions>
    </dependency>
    

    您需要排除标记​​p>

    【讨论】:

    • @Elikill58,你能回答这个问题吗? stackoverflow.com/questions/71104529/…
    • @Theman 不,对不起,我对你的问题没有那么强烈。您的问题似乎很好,但我认为在其他帖子上为它制作广告不是一个好主意
    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 2012-12-15
    • 2019-12-25
    • 2016-09-18
    • 2017-05-07
    • 2020-03-29
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多