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

时间:2018-11-22 05:15:05

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

  

(为此我也提出了GitHub问题-   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

<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安装与这2个依赖项配合良好。我需要添加以下(第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“物料清单”(Bill of Materials)依赖项管理器,它应该管理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以某种方式隔离子依赖吗?

2 个答案:

答案 0 :(得分:5)

我能够解决此问题,只需从Google Cloud-pubsub工件中排除grpc-core即可。此后,它将其与Beam-runners-google-cloud-dataflow-java

的依赖项合并到与依赖项树相同的1.13.1版本中。

这是对我有用的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>

答案 1 :(得分: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的成本显着增加。