4

Beam正在使用Google的auto/valueauto/service工具。Apache Beam:无法找到gs的注册商

我想使用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> 

我能够开始从的IntelliJ管道。但是,当罐子通过mvn package编译并运行java -jar它抛出一个错误:

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

的fatjar是包maven-assembly-plugin。类在罐子里。

回答

5

问题在于你建立你的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的要求,如配置为使用ServicesResourceTransformer来构建您的fatjar时的maven-shade-plugin

+0

谢谢!你是对的。我昨天晚上通过从原型创建一个Beam项目并比较了我的'pom.xml'和新的'pom.xml'之间的区别,我发现了它。切换到'maven-shade-plugin'后,它开始工作得很好。 –

+0

如果你在Shadow插件中使用Gradle,你可以通过在shadowJar {...}闭包中使用'mergeServiceFiles()'来解决这个问题。 – Cristian

2

这看起来像是一个组装策略的问题,您应该累积/合并org.apache.beam.sdk.io.FileSystemRegistrar的服务。有关类似问题的更多信息here