带有google-cloud-core-grpc依赖关系的Java应用中的Maven冲突

Maven conflict in Java app with google-cloud-core-grpc dependency

(I've also raised a GitHub issue for this -
https://github.com/googleapis/google-cloud-java/issues/4095)

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

依赖关系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)

1
2
3
4
5
<dependency>
  <groupId>com.google.cloud.dataflow</groupId>
  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

1
2
3
4
5
<dependency>
  <groupId>org.apache.beam</groupId>
  beam-runners-google-cloud-dataflow-java</artifactId>
  <version>2.8.0</version>
</dependency>

使用这两个依赖项,Maven安装可以正常工作。我需要添加以下(第3个)依赖项,以便在Apache Beam管道之外独立订阅Google Cloud发布/订阅:

google-cloud-pubsub

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

1
2
3
4
5
<dependency>
  <groupId>com.google.cloud</groupId>
  google-cloud-pubsub</artifactId>
  <version>1.53.0</version>
</dependency>

(这是最新版本)。添加此选项后,在执行mvn clean install后出现以下冲突:

1
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依赖性的子依赖性,但这不能为我解决冲突:

1
2
3
4
5
6
7
8
9
10
11
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        google-cloud-bom</artifactId>
        <version>0.71.0-alpha</version>
        <type>pom</type>
        <scope>import</scope>
       </dependency>
     </dependencies>
  </dependencyManagement>

我遵循了这个问题的答案-

如何解决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以某种方式隔离子依赖项吗?


我能够解决此问题,只需从Google Cloud-pubsub工件中排除grpc-core即可。此后,它以与Beam-runners-google-cloud-dataflow-java的依赖项相同的版本1.13.1并入依赖项树中。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependencies>
    <dependency>
        <groupId>com.google.cloud</groupId>
        google-cloud-pubsub</artifactId>
        <version>1.53.0</version>
        <exclusions>
            <exclusion>
                <groupId>io.grpc</groupId>
                grpc-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.beam</groupId>
        beam-runners-google-cloud-dataflow-java</artifactId>
        <version>2.8.0</version>
    </dependency>
</dependencies>

这并不是真正的解决方案,但是我确实确定问题主要出在此依赖性上:

1
2
3
4
5
<dependency>
  <groupId>com.google.cloud.dataflow</groupId>
  google-cloud-dataflow-java-sdk-all</artifactId>
  <version>2.5.0</version>
</dependency>

该工件对io.grpc:grpc-core:jar的依赖关系不一致,并且Apache Beam和Google pub子工件之间的隔离实际上无法正常工作。无论使用什么版本的google-cloud-pubsub,它自己对io.grpc:grpc-core:jar的依赖都将与io.grpc:grpc-core:jar的版本之一冲突。

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

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

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

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

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