1.HDFS + WEB 项目 报java.lang.VerifyError... 异常
抛异常:
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)
冲突来自 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类,导致在运行过程中的冲突。
解决方法一:
将web工程应用Java EE 5。笔者的项目使用Java EE 5已经足够了,如果你们的项目中有使用到Java EE 6的功能可以通过另外导入需要的工具实现。
解决方法二:
将Java EE 6 的包通过 ADD JARs... 的方式导入。
注意:不要将 Java EE 6中的包直接放到WebRoot/WEB-INF/lib 下,这样同样会导致包冲突
2.报异常java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationRe
java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()
这些都是:
Hadoop相关jar中依赖jetty、servlet等第三方jar包和当前项目中的有冲突,
1.如用的maven的话,在pom文件中排除这些jar包后,启动访问页面就正常了:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
<exclusions>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
</exclusion>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
</exclusion>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1</artifactId>
</exclusion>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-api-2.1</artifactId>
</exclusion>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api-2.1</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
<exclusion>
<groupId>tomcat</groupId>
<artifactId>jasper-compiler</artifactId>
</exclusion>
<exclusion>
<groupId>tomcat</groupId>
<artifactId>jasper-runtime</artifactId>
</exclusion>
</exclusions>
</dependency>
2,如是您自己手工在lib加入的话,哪就要将这几个包去掉,目前我就是这样做的,可以用运行(有具体版本号,我没写,但是前面都一样)
jersey-server-1.9.jar
jasper-runtime-5.5.23.jar
jasper-compiler-5.5.23.jar
servlet-api.jar
jsp-api.jar
jetty-util.jar
jetty.jar