Paw*_*zur 6 java maven google-cloud-storage google-cloud-dataflow apache-beam
我想运行带有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班级在罐子里.
问题在于你正在构建你的胖子.将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.