4

kann nicht gefunden werden. Beam verwendet die beiden Google-Tools auto/value und auto/service.Apache Beam: Registrar für GS

Ich möchte eine Pipeline mit Dataflow-Runner und Daten auf Google Cloud Storage gespeichert werden.

Ich habe ein Abhängigkeit hinzugefügt:

<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> 

Ich bin in der Lage, die Pipeline von der IntelliJ zu starten. Aber wenn das Glas durch eine mvn package kompiliert und ausgeführt mit java -jar wirft er einen Fehler:

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

Die fatjar ist Paket mit maven-assembly-plugin. GcsFileSystemRegistrar Klasse ist im Glas.

Antwort

5

Das Problem ist in der Art, wie Sie Ihren Fatjar bauen. maven-assembly-plugin verarbeitet Dateien, die mit ServiceLoader verknüpft sind, nicht korrekt. ServiceLoader setzt voraus, dass Einträge für jede Implementierung in META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar aufgeführt sind, damit Java sie finden kann.

die Inhalte der META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar in Ihrem fatjar ist wahrscheinlich nur:

org.apache.beam.sdk.io.LocalFileSystemRegistrar 

Sie müssen es die Liste (und alle anderen Implementierungen, die Sie wünschen):

org.apache.beam.sdk.io.LocalFileSystemRegistrar 
org.apache.beam.sdk.extensions.gcp.storage.GcsFileSystemRegistrar 

Ihre beste Wette ist ein Werkzeug zu benutzen, das diese ServiceLoader Anforderungen wie die maven-shade-plugin versteht, wenn es konfiguriert ist, die ServicesResourceTransformer zu verwenden, um deinen fatjar zu bauen.

+0

Danke! Du hast recht. Ich habe es gestern spät in der Nacht herausgefunden, indem ich ein Beam-Projekt vom Archetyp erstellt und die Unterschiede zwischen meiner 'pom.xml' und der neuen' pom.xml' verglichen habe. Nach dem Wechsel zu 'maven-shade-plugin' hat es gut funktioniert. –

+0

Wenn Sie Gradle mit dem Shadow-Plugin verwenden, können Sie dies beheben, indem Sie 'mergeServiceFiles()' in der 'shadowJar {...}' -Schließung verwenden. – Cristian

2

Dies sieht wie ein Problem mit Assembly-Strategie aus, Sie sollten die Dienste für org.apache.beam.sdk.io.FileSystemRegistrar akkumulieren/zusammenführen. Mehr über ähnliches Problem here.

Verwandte Themen