hadoop+javaWeb的開發中遇到包沖突問題(java.lang.VerifyError)


 

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
 
最后您還可用查看其它人的:
http://brandnewuser.iteye.com/blog/2208969
http://www.micmiu.com/exception/jee-hadoop-nosuchmethod-error-getproblems/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM