具有 google-cloud-core-grpc 依赖项的 Java 应用程序中的 Maven 冲突 [英] Maven conflict in Java app with google-cloud-core-grpc dependency
问题描述
(我还为此提出了一个 GitHub 问题 -https://github.com/googleapis/google-cloud-java/issues/4095)
(I've also raised a GitHub issue for this - https://github.com/googleapis/google-cloud-java/issues/4095)
我有 Apache Beam 的以下 2 个依赖项的最新版本:
I have the latest versions of the following 2 dependencies for Apache Beam:
依赖项 1 - google-cloud-dataflow-java-sdk-all
(Apache Beam 的一个发行版,旨在简化 Apache Beam 在 Google Cloud Dataflow 服务上的使用 - https://mvnrepository.com/artifact/com.google.cloud.dataflow/google-cloud-dataflow-java-sdk-all)>
(A distribution of Apache Beam designed to simplify usage of Apache Beam on Google Cloud Dataflow service - 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 管道)
(I'm guessing that this allows the actual running of a Beam pipeline inside a Google Cloud Dataflow)
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 安装适用于这两个依赖项.我需要添加以下(第三个)依赖项,以便在 Apache Beam 管道之外独立订阅 Google Cloud 发布/订阅:
The Maven install works fine with these 2 dependencies. I need to add the following (3rd) dependency for independently subscribing to a Google Cloud pub/sub outside of an Apache Beam pipeline:
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
后遇到以下冲突:
(This is the latest version). After this is added I get the following conflict after I do 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 安装冲突.
I don't get any Maven install conflict if I remove the Apache Beam dependencies and keep the google-cloud-pubsub
dependency.
有一个单独的 Google 'BOM'(物料清单)依赖项管理器应该管理 Google Cloud 依赖项的子依赖项,但这并不能解决我的冲突:
There's a separate Google 'BOM' (Bill of Materials) dependency manager that's supposed to manage sub-dependencies of Google Cloud dependencies, but this doesn't solve the conflict for me:
<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>
我按照这个问题的答案 -
I followed the answer to this question -
我发现
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 框架)
(GRPC is A high performance, open-source universal RPC framework)
如果我添加 io.grpc:grpc-core:jar:1.6.1
作为我 POM 文件的显式依赖项,它不会固定"依赖项,因为它仍然被拉入作为 com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all:jar:2.5.0
的子依赖项.
If I add io.grpc:grpc-core:jar:1.6.1
as an explicit dependency to my POM file, it doesn't 'pin' the dependency as it still gets pulled in as a sub-dependency by 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 的版本:
On the following GitHub issue, garrettjonesgoogle confirms on 21 Feb that google-cloud-bom doesn't pin the version for io.grpc:grpc-core:
https://github.com/googleapis/google-cloud-java/issues/2890
似乎 Apache Beam 依赖项在内部管理着 io.grpc:grpc-core:jar
的不同版本,但这与 Google pub/sub 依赖项使用的(一致)版本冲突.
It seems that the Apache Beam dependency manages the varying versions of io.grpc:grpc-core:jar
internally, however this conflicts with the (consistent) version used by the Google pub/sub dependency.
我能做些什么来解决这个问题吗?我可以使用 Maven 以某种方式隔离子依赖项吗?
Is there anything I can do to work around this? Can I maybe isolate sub-dependencies somehow using Maven?
推荐答案
我能够解决这个问题,只需从 google-cloud-pubsub 工件中排除 grpc-core.之后它被合并到依赖树中,版本 1.13.1 与 beam-runners-google-cloud-dataflow-java 的依赖项相同
I was able to workaround this issue buy just excluding grpc-core from google-cloud-pubsub artifact. It gets incorporated in the dependency tree afterwards with the same version 1.13.1 as a dependency of beam-runners-google-cloud-dataflow-java
这是对我有用的 pom.xml 的 exceprt.
This is the exceprt of the pom.xml which worked for me.
<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>
这篇关于具有 google-cloud-core-grpc 依赖项的 Java 应用程序中的 Maven 冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!