【原創】大叔問題定位分享(37)easyexcel下載有時報錯NoClassDefFoundError


使用easyexcel實現excel導出功能,有時會報錯

com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.beans.BeanMap$Generator
at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:99) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:155) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:140) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.builder.ExcelWriterSheetBuilder.doWrite(ExcelWriterSheetBuilder.java:134) ~[easyexcel-2.0.2.jar:na]
...
Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.beans.BeanMap$Generator
at net.sf.cglib.beans.BeanMap.create(BeanMap.java:56) ~[cglib-3.1.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.addJavaObjectToExcel(ExcelBuilderImpl.java:201) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.addOneRowOfDataToExcel(ExcelBuilderImpl.java:128) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.doAddContent(ExcelBuilderImpl.java:79) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:93) ~[easyexcel-2.0.2.jar:na]
... 142 common frames omitted

經確認服務器上的war包含報錯的class

# ls -l /app.war
-rw-r--r-- 1 root root 161587776 Apr 10 09:32 /app.war

# unzip -l /app.war|grep cglib
   283080  03-25-2020 10:57   WEB-INF/lib/cglib-3.1.jar

# unzip -l cglib-3.1.jar |grep BeanMap$Generator
      336  12-07-2013 11:28   net/sf/cglib/beans/BeanMap$Generator$BeanMapKey.class
     3219  12-07-2013 11:28   net/sf/cglib/beans/BeanMap$Generator.class
     5008  12-07-2013 11:28   net/sf/cglib/beans/BeanMap.class
     1825  12-07-2013 11:28   net/sf/cglib/beans/BeanMapEmitter$1.class
     2090  12-07-2013 11:28   net/sf/cglib/beans/BeanMapEmitter$2.class
     1546  12-07-2013 11:28   net/sf/cglib/beans/BeanMapEmitter$3.class
     6339  12-07-2013 11:28   net/sf/cglib/beans/BeanMapEmitter.class

繼續看日志發現另外一個異常

com.alibaba.excel.exception.ExcelGenerateException: java.lang.IncompatibleClassChangeError: class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super 
class
at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:99) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:155) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:140) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.builder.ExcelWriterSheetBuilder.doWrite(ExcelWriterSheetBuilder.java:134) ~[easyexcel-2.0.2.jar:na]
...
Caused by: java.lang.IncompatibleClassChangeError: class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_242]
at java.lang.ClassLoader.defineClass(ClassLoader.java:757) ~[na:1.8.0_242]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_242]
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2419) ~[catalina.jar:9.0.33]
at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865) ~[catalina.jar:9.0.33]
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1334) ~[catalina.jar:9.0.33]
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) ~[catalina.jar:9.0.33]
at net.sf.cglib.core.DefaultGeneratorStrategy.getClassVisitor(DefaultGeneratorStrategy.java:30) ~[cglib-3.1.jar:na]
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24) ~[cglib-3.1.jar:na]
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) ~[cglib-3.1.jar:na]
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:144) ~[cglib-3.1.jar:na]
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116) ~[cglib-3.1.jar:na]
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108) ~[cglib-3.1.jar:na]
at net.sf.cglib.beans.BeanMap$Generator.<clinit>(BeanMap.java:64) ~[cglib-3.1.jar:na]
at net.sf.cglib.beans.BeanMap.create(BeanMap.java:56) ~[cglib-3.1.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.addJavaObjectToExcel(ExcelBuilderImpl.java:201) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.addOneRowOfDataToExcel(ExcelBuilderImpl.java:128) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.doAddContent(ExcelBuilderImpl.java:79) ~[easyexcel-2.0.2.jar:na]
at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:93) ~[easyexcel-2.0.2.jar:na]
... 142 common frames omitted

檢查發現DebuggingClassWriter繼承了ClassVisitor

# javap -cp cglib-3.1.jar net.sf.cglib.core.DebuggingClassWriter
Compiled from "DebuggingClassWriter.java"
public class net.sf.cglib.core.DebuggingClassWriter extends org.objectweb.asm.ClassVisitor {
  public static final java.lang.String DEBUG_LOCATION_PROPERTY;
  static java.lang.Class class$org$objectweb$asm$ClassVisitor;
  static java.lang.Class class$java$io$PrintWriter;
  public net.sf.cglib.core.DebuggingClassWriter(int);
  public void visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[]);
  public java.lang.String getClassName();
  public java.lang.String getSuperName();
  public byte[] toByteArray();
  static java.lang.Class class$(java.lang.String);
  static org.objectweb.asm.ClassVisitor access$001(net.sf.cglib.core.DebuggingClassWriter);
  static java.lang.String access$100();
  static java.lang.String access$200(net.sf.cglib.core.DebuggingClassWriter);
  static java.lang.reflect.Constructor access$300();
  static {};
}

報錯信息為:

class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class

翻譯過來是:ClassVisitor本來應該是一個interface,但是卻作為class被繼承(extends),說明可能有jar包沖突,ClassVisitor在一個jar包中是interface,在一個jar包中是class

# unzip -l /data/dataone-api/webapps/dataone-api.war|grep asm
    47895  03-25-2020 10:57   WEB-INF/lib/asm-4.2.jar
    32693  08-03-2019 20:19   WEB-INF/lib/asm-commons-3.1.jar
    21879  08-03-2019 20:19   WEB-INF/lib/asm-tree-3.1.jar
    43033  08-03-2019 20:19   WEB-INF/lib/asm-3.1.jar

發現asm有兩個版本,一個3.1,一個4.2,查看maven的依賴樹

# mvn dependency:tree
...
[INFO] \- com.alibaba:easyexcel:jar:2.0.2:compile
[INFO]    +- cglib:cglib:jar:3.1:compile
[INFO]    |  \- org.ow2.asm:asm:jar:4.2:compile
[INFO]    \- org.ehcache:ehcache:jar:3.6.3:compile
...
[INFO] +- org.apache.hive:hive-jdbc:jar:1.1.0:compile
[INFO] |  +- org.apache.hive:hive-common:jar:1.1.0:compile
[INFO] |  |  +- log4j:apache-log4j-extras:jar:1.2.17:compile
[INFO] |  |  \- org.apache.ant:ant:jar:1.9.1:compile
[INFO] |  |     \- org.apache.ant:ant-launcher:jar:1.9.1:compile
[INFO] |  +- org.apache.hive:hive-service:jar:1.1.0:compile
[INFO] |  |  +- net.sf.jpam:jpam:jar:1.1:compile
[INFO] |  |  \- org.eclipse.jetty.aggregate:jetty-all:jar:7.6.0.v20120127:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile
[INFO] |  |     +- javax.mail:mail:jar:1.4.1:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-jaspic_1.0_spec:jar:1.0:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-annotation_1.0_spec:jar:1.1.1:compile
[INFO] |  |     \- asm:asm-commons:jar:3.1:compile
[INFO] |  |        \- asm:asm-tree:jar:3.1:compile
[INFO] |  |           \- asm:asm:jar:3.1:compile

4.2是是easyexcel-2.0.2.jar依賴,3.1是hive-jdbc-1.1.0.jar依賴,修改pom去掉3.1的依賴

        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>1.1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>asm</groupId>
                    <artifactId>asm</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

問題解決


免責聲明!

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



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