【问题标题】:Maven conflict in Java app with google-cloud-core-grpc dependencyJava 应用程序中的 Maven 冲突与 google-cloud-core-grpc 依赖项
【发布时间】:2019-04-24 17:49:55
【问题描述】:

(我还为此提出了一个 GitHub 问题 - https://github.com/googleapis/google-cloud-java/issues/4095)

我有以下 2 个 Apache Beam 依赖项的最新版本:

依赖 1 - google-cloud-dataflow-java-sdk-all

(旨在简化 Apache Beam 在 Google Cloud Dataflow 服务上的使用的 Apache Beam 发行版 - https://mvnrepository.com/artifact/com.google.cloud.dataflow/google-cloud-dataflow-java-sdk-all

<dependency>
  <groupId>com.google.cloud.dataflow</groupId>
  <artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
  <version>2.5.0</version>
</dependency>

依赖 2 - beam-runners-google-cloud-dataflow-java

(我猜这允许在 Google Cloud Dataflow 中实际运行 Beam 管道)

https://mvnrepository.com/artifact/org.apache.beam/beam-runners-google-cloud-dataflow-java

<dependency>
  <groupId>org.apache.beam</groupId>
  <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
  <version>2.8.0</version>
</dependency>

Maven 安装适用于这两个依赖项。我需要添加以下(第 3 个)依赖项,以便在 Apache Beam 管道之外独立订阅 Google Cloud pub/sub:

google-cloud-pubsub

https://mvnrepository.com/artifact/com.google.cloud/google-cloud-pubsub

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-pubsub</artifactId>
  <version>1.53.0</version>
</dependency>

(这是最新版本)。添加此内容后,我在执行mvn clean install 后遇到以下冲突:

Could not resolve version conflict among [com.google.cloud:google-cloud-pubsub:jar:1.53.0 -> com.google.cloud:google-cloud-core-grpc:jar:1.53.0 -> io.grpc:grpc-protobuf:jar:1.16.1 -> io.grpc:grpc-core:jar:1.16.1, com.google.cloud:google-cloud-pubsub:jar:1.53.0 -> com.google.cloud:google-cloud-core-grpc:jar:1.53.0 -> io.grpc:grpc-protobuf:jar:1.16.1 -> io.grpc:grpc-protobuf-lite:jar:1.16.1 -> io.grpc:grpc-core:jar:1.16.1, com.google.cloud:google-cloud-pubsub:jar:1.53.0 -> io.grpc:grpc-netty-shaded:jar:1.16.1 -> io.grpc:grpc-core:jar:[1.16.1,1.16.1], com.google.cloud:google-cloud-pubsub:jar:1.53.0 -> io.grpc:grpc-stub:jar:1.16.1 -> io.grpc:grpc-core:jar:1.16.1, com.google.cloud:google-cloud-pubsub:jar:1.53.0 -> io.grpc:grpc-auth:jar:1.16.1 -> io.grpc:grpc-core:jar:[1.16.1,1.16.1], com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> io.grpc:grpc-core:jar:1.2.0, com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> io.grpc:grpc-netty:jar:1.2.0 -> io.grpc:grpc-core:jar:[1.2.0,1.2.0], com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> com.google.cloud.bigtable:bigtable-protos:jar:1.0.0-pre3 -> io.grpc:grpc-core:jar:1.5.0, com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> com.google.cloud.bigtable:bigtable-client-core:jar:1.0.0 -> io.grpc:grpc-core:jar:1.7.0, com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> com.google.cloud.bigtable:bigtable-client-core:jar:1.0.0 -> io.opencensus:opencensus-contrib-grpc-util:jar:0.7.0 -> io.grpc:grpc-core:jar:1.6.1, com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> io.grpc:grpc-all:jar:1.2.0 -> io.grpc:grpc-core:jar:[1.2.0,1.2.0], com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> io.grpc:grpc-all:jar:1.2.0 -> io.grpc:grpc-okhttp:jar:1.2.0 -> io.grpc:grpc-core:jar:[1.2.0,1.2.0], com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 -> org.apache.beam:beam-sdks-java-io-google-cloud-platform:jar:2.5.0 -> io.grpc:grpc-all:jar:1.2.0 -> io.grpc:grpc-protobuf-nano:jar:1.2.0 -> io.grpc:grpc-core:jar:1.2.0

如果我删除 Apache Beam 依赖项并保留 google-cloud-pubsub 依赖项,我不会遇到任何 Maven 安装冲突。

有一个单独的 Google 'BOM'(物料清单)依赖项管理器应该管理 Google Cloud 依赖项的子依赖项,但这并不能解决我的冲突:

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-bom</artifactId>
        <version>0.71.0-alpha</version>
        <type>pom</type>
        <scope>import</scope>
       </dependency>
     </dependencies>
  </dependencyManagement>

我按照这个问题的答案 -

How do I resolve a dependency conflict in Maven?

我发现


  • com.google.cloud:google-cloud-pubsub:jar:1.53.0

有一个子依赖:

io.grpc:grpc-core:jar:1.16.1


  • com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0

对不同版本有子依赖:

io.grpc:grpc-core:jar


(GRPC 是一个高性能、开源的通用 RPC 框架)

如果我将 io.grpc:grpc-core:jar:1.6.1 作为显式依赖项添加到我的 POM 文件中,它不会“固定”该依赖项,因为它仍会被 com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0 作为子依赖项拉入。

在以下 GitHub 问题上,garrettjonesgoogle 于 2 月 21 日确认 google-cloud-bom 没有固定 io.grpc:grpc-core 的版本:

https://github.com/googleapis/google-cloud-java/issues/2890

Apache Beam 依赖项似乎在内部管理 io.grpc:grpc-core:jar 的不同版本,但这与 Google pub/sub 依赖项使用的(一致)版本冲突。

我能做些什么来解决这个问题吗?我可以使用 Maven 以某种方式隔离子依赖项吗?

【问题讨论】:

  • 运气好吗?我现在遇到了完全相同的问题。
  • @Iso 我添加了更多信息,但仍未解决我的问题。您可以查看此问题的答案,这可能会帮助您确定问题依赖项是什么 - stackoverflow.com/questions/37594922/…。如果您按照说明进行操作,您应该会得到一个显示依赖项的文本文件,以逗号分隔,包。在 2 个或更多不同的包中查找相同子依赖项的不同版本号。您可以看到任何重复的具有不同版本号的包都可能是您的问题包。
  • @Iso 你也可以试试这个来识别你的冲突依赖,虽然它对我不起作用它只是给了我已经得到的相同的错误输出 - maven.apache.org/插件/maven-dependency-plugin/examples/…
  • @Iso 我添加了一个“答案”。这不是一个实际的解决方案,但它确定了我的问题的原因。我现在正在解决这个问题。你可以通过轮询而不是使用 pub/sub 来做同样的事情吗?

标签: java maven google-cloud-platform google-cloud-dataflow apache-beam


【解决方案1】:

我能够解决这个问题,只需从 google-cloud-pubsub 工件中排除 grpc-core。之后它被合并到依赖关系树中,版本与 1.13.1 版本相同,作为 beam-runners-google-cloud-dataflow-java 的依赖项

这是对我有用的 pom.xml 的摘录。

<dependencies>
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-pubsub</artifactId>
        <version>1.53.0</version>
        <exclusions>
            <exclusion>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.beam</groupId>
        <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
        <version>2.8.0</version>
    </dependency>
</dependencies>

【讨论】:

    【解决方案2】:

    这并不是真正的解决方案,但我确实发现问题主要在于这种依赖关系:

    <dependency>
      <groupId>com.google.cloud.dataflow</groupId>
      <artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
      <version>2.5.0</version>
    </dependency>
    

    此工件与 io.grpc:grpc-core:jar 存在许多不一致的依赖关系,并且 Apache Beam 和 Google pub sub 工件之间的隔离并不能真正正常工作。无论使用什么版本的google-cloud-pubsub,它自己对io.grpc:grpc-core:jar 的依赖都会与io.grpc:grpc-core:jar 的某个版本发生冲突。

    我针对 Google 工件提出了以下 Git 问题:

    https://github.com/googleapis/google-cloud-java/issues/4095
    

    我针对 Apache Beam 工件提出了以下问题(它指向了我提出的 Google 问题):

    https://issues.apache.org/jira/browse/BEAM-6118

    我正在解决这个问题。我可以轮询我需要的数据,而不是通过订阅 pub/sub 来使用它,但这并不是最佳选择,并且会导致 Google Cloud 的成本显着增加。

    【讨论】:

    • 嗨,克里斯。请原谅我忽略了你之前的回复。我有这个过度简化的设置,用于母题概念验证。我通过分离项目来解决冲突(在我的例子中,我正在处理捆绑的 Pub/Sub 发布者和 Dataflow 项目)。这确实不是最佳的,但暂时可以。感谢您的提醒,我会密切关注这个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2013-06-24
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多