这是
maven-assembly插件破坏事情的典型情况。
为什么这发生在我们身上
不同的JAR(
hadoop-commonsfor LocalFileSystem,hadoop-hdfsfor DistributedFileSystem)各自
org.apache.hadoop.fs.FileSystem在其meta-INFO/services目录中包含一个不同的文件。该文件列出了要声明的文件系统实现的规范类名(这称为通过实现的服务提供者接口
java.util.ServiceLoader,请参见
org.apache.hadoop.FileSystem#loadFileSystems)。
当使用时
maven-assembly-plugin,它将所有的JAR合并为一个,并且全部
meta-INFO/services/org.apache.hadoop.fs.FileSystem覆盖彼此。这些文件仅保留其中一个(添加的最后一个)。在这种情况下,
FileSystemfrom的列表将
hadoop-commons覆盖from 的列表
hadoop-hdfs,因此
DistributedFileSystem不再声明。
我们如何解决它
在加载Hadoop配置之后,但在进行任何
FileSystem相关操作之前,我们将其称为:
hadoopConfig.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName() ); hadoopConfig.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName() );更新:正确的修复
引起我注意的是krookedking,有一种基于配置的方法可以maven-assembly使用所有FileSystem服务声明的合并版本



