Apache Beam:无法找到 gs 的注册商

Apache Beam: Unable to find registrar for gs

Beam 同时使用了 Google 的 auto/value and auto/service 工具。

我想 运行 一个带有 Dataflow 运行 的管道,数据存储在 Google Cloud Storage 上。

我添加了一个依赖:

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

<dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-extensions-google-cloud-platform-core</artifactId>
    <version>2.0.0</version>
</dependency>

我能够从 IntelliJ 启动管道。但是当通过 mvn package 和 运行 和 java -jar 编译 jar 时,它会抛出一个错误:

java.lang.IllegalStateException: Unable to find registrar for gs

fatjar 是用 maven-assembly-plugin 打包的。 GcsFileSystemRegistrar class 在罐子里。

问题在于您构建 fatjar 的方式。 maven-assembly-plugin 没有正确处理与 ServiceLoader 关联的文件。 ServiceLoader 依赖于每个实现的 META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar 中列出的条目,以便 Java 知道如何找到它们。

您的 fatjar 中 META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar 的内容可能只有:

org.apache.beam.sdk.io.LocalFileSystemRegistrar

您需要列出它(以及您想要的任何其他实现):

org.apache.beam.sdk.io.LocalFileSystemRegistrar
org.apache.beam.sdk.extensions.gcp.storage.GcsFileSystemRegistrar

您最好的选择是使用理解这些 ServiceLoader 要求的工具,例如 maven-shade-plugin 当配置为使用 ServicesResourceTransformer 构建您的 fatjar 时。

这看起来像是装配策略的问题,您应该 accumulate/merge org.apache.beam.sdk.io.FileSystemRegistrar 的服务。有关类似问题的更多信息 here.