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