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

Paw*_*zur 6 java maven google-cloud-storage google-cloud-dataflow apache-beam

Beam正在使用Google的自动/价值自动/服务工具.

我想运行带有Dataflow流水线的管道,数据存储在Google云端存储上.

我添加了一个依赖项:

<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>
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalStateException: Unable to find registrar for gs
Run Code Online (Sandbox Code Playgroud)

胖子是打包的maven-assembly-plugin.GcsFileSystemRegistrar班级在罐子里.

Luk*_*wik 8

问题在于你正在构建你的胖子.将maven-assembly-plugin不处理与相关的文件ServiceLoader正确.ServiceLoader依赖于META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar每个实现中列出的条目,以便Java知道如何找到它们.

的内容META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar在你fatjar只可能是:

org.apache.beam.sdk.io.LocalFileSystemRegistrar
Run Code Online (Sandbox Code Playgroud)

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

org.apache.beam.sdk.io.LocalFileSystemRegistrar
org.apache.beam.sdk.extensions.gcp.storage.GcsFileSystemRegistrar
Run Code Online (Sandbox Code Playgroud)

最好的办法是使用一个了解这些ServiceLoader要求的工具,比如maven-shade-plugin配置为使用ServicesResourceTransformer来构建你的fatjar.