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

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

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

我添加了一个依赖项:

 org.apache.beam beam-runners-google-cloud-dataflow-java 2.0.0   org.apache.beam beam-sdks-java-extensions-google-cloud-platform-core 2.0.0  

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

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

fatjar是包含maven-assembly-pluginGcsFileSystemRegistrar类在jar中。

问题在于你正在构建你的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 

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

这看起来像汇编策略的问题,您应该为org.apache.beam.sdk.io.FileSystemRegistrar积累/合并服务。 更多类似的问题在这里 。