【原创】大叔问题定位分享(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>

问题解决

原文地址:https://www.cnblogs.com/barneywill/p/13471324.html