Google FileSystemRefistrar 的数据流 jar 文件打包问题

Google Dataflow jar file packaging issue with FileSystemRefistrar

我在我的 IntelliJ 中测试我的数据流 java 应用程序,它工作得很好。但是当运行数据流jar文件在linux系统中时,出现了这个问题:

这是我用于数据流的选项: --project=myproject --stagingLocation=gs://mybucket/staging2 --tempLocation=gs://mybucket/gcp-temp2 --gcpTempLocation=gs://mybucket/gcp-temp2 --bigtableProjectId=myinstance --bigtableInstanceId=user-test --bigtableTableId=test_table1

所以问题是gs目录没有被正确识别。事实上,它被认为是我 运行 我的 jar 文件所在的服务器的本地目录。

出现这个目录问题的原因如下:

我查找了 [maven assembly jar] 与 [maven shade jar] 之间的区别,发现 FileSystemRefistrar 指向了错误的文件。

但是使用 shade 插件不是解决问题的办法,我只是幸运的是 class 是 GcsFileSystemRegistrar 没有被覆盖。当我更改依赖顺序时,同样的问题再次出现。

为了完成这项工作,我必须按以下顺序拥有这两个库:

beam-runners-google-cloud-dataflow-java

beam-sdks-java-core

'beam-sdks-java-core'包含在'beam-runners-google-cloud-dataflow-java'中,但我需要在'beam-runners-google-cloud-dataflow-java'之后添加它。所以 dependencyHierarchy 看起来很有趣,但这是我让它工作的唯一方法。外观如下:

如果我排除'beam-sdks-java-core'或更改顺序,问题又会出现。我尝试使用 Maven 插件排除它,但它没有用。

所以我的问题是如何正确设置 FileSystemRegistrar?我不知道为什么会这样。

+我希望遇到此问题的人可以从本文中得到提示。我为此挣扎了很多:'(

正如 OGCheeze 评论的那样,通过将 maven shade 插件与 ServicesResourceTransformer 结合使用解决了这个问题。在 有更详细的解释。