HDFS + WEB 項目 報java.lang.VerifyError... 異常

今天在用web項目整合 HDFS 的時候發生了很是詭異的事情。我將java項目的HDFS功能整合至 web項目的時候建立FileSystem對象就報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

異常。而一樣的程序在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... 的方式導入。
注意:不要將 Java EE 6中的包直接放到WebRoot/WEB-INF/lib 下,這樣一樣會致使包衝突
相關文章
相關標籤/搜索