异常。而一样的程序在java项目中却运行的正常。 java
FileSystem建立代码 web
File workaround = new File("."); System.getProperties().put("hadoop.home.dir", workaround.getAbsolutePath()); new File("./bin").mkdirs(); new File("./bin/winutils.exe").createNewFile(); String hdfsURL = "hdfs://192.168.1.118:50040"; Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get(new URI(hdfsURL), configuration);抛异常:
Exception in thread "main" java.lang.VerifyError: (class: com/google/common/collect/Interners, method: newWeakInterner signature: ()Lcom/google/common/collect/Interner;) Incompatible argument to function
at org.apache.hadoop.util.StringInterner.<clinit>(StringInterner.java:48)
at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:2472)
at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:2364)
at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2281)
at org.apache.hadoop.conf.Configuration.get(Configuration.java:888)
at org.apache.hadoop.conf.Configuration.getTrimmed(Configuration.java:907)
at org.apache.hadoop.conf.Configuration.getBoolean(Configuration.java:1308)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:366) apache
所以我怀疑,这里存在web项目的包和hdfs相关包冲突了。因而花了好长的时间找啊找,终于找到了冲突的包。 工具
冲突来自 Java_EE_6 中的weld-osgi-bundle.jar 和 guava-11.0.2.jar 这两个包。 com/google/common/collect/Interners 类是 HDFS在建立FileSystem时所须要使用的一个建立Interner类的工具类,可是 weld-osgi-bundle.jar和guava-11.0.2.jar 存在了同样的结构,而weld-osgi-bundle.jar中却不存在Interners类,致使在运行过程当中的冲突。 oop
解决方法一:
将web工程应用Java EE 5。笔者的项目使用Java EE 5已经足够了,若是大家的项目中有使用到Java EE 6的功能能够经过另外导入须要的工具实现。 google
解决方法二: spa
将Java EE 6 的包经过 ADD JARs... 的方式导入。