java.lang.NoClassDefFoundError错误产生的原因及解决方案(一种方案)

NoClassDefFoundError

最近在使用 Redisson 框架实现分布式锁的时候,在项目启动之后,报错:
类的定义没有找到, 根本原因是 ClassNotFoundException , 但是在编译的时候,并没有报错,运行本地的测试类来进行创建对应的对象也没有问题

创建的测试类如下,

import org.junit.Test;
import org.redisson.Redisson;
import org.redisson.config.Config;

public class RedissonTest {

    @Test
    public void test1() {
    //Config 类 和 Redisson类是要进行创建 的类
        Config config = new Config();
        config.useSingleServer().setAddress("127.0.0.1:6379");
        Redisson redisson = (Redisson) Redisson.create(config);
        System.out.println(config);
        System.out.println(redisson);
    }
}

在进行测试的时候,输出正常,没有报错,
但是当启动Tomcat的时候,服务器抛出异常

Caused by: java.lang.NoClassDefFoundError: org/redisson/config/Config
at com.mmall.common.RedissonManager.(RedissonManager.java:20)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
… 60 more
Caused by: java.lang.ClassNotFoundException: org.redisson.config.Config
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1292)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1121)
… 66 more

从上明德异常日志可以看出,是 org/redisson/config/Config 这个类的ClassDefNotFound, 但是编译的时候是没有问题的,到了运行,项目部署的时候,抛出了这个异常,而且通过查看根异常, 是ClassNotFoundException, 在这个地方困扰了很久。 编译的时候是可以的,但是到了运行的时候,就抛出了异常。

方案一(失败)

删除了Maven中的依赖配置

  
   org.redisson
    redisson-all
       2.8.1
    
   
        com.fasterxml.jackson.dataformat
        jackson-dataformat-avro
        2.9.0
    

然后删除本地仓库中的 jar包, 重新引入依赖,最终还是失败,没有解决问题。

方案二(奏效)

既然是使用Maven依赖的问题,编译的时候是没有问题的(IDE不报错),但是到了Spring去初始化Bean的时候发生了ClassNotFoundException,java.lang.NoClassDefFoundError: org/redisson/config/Config;

那么自然想到的最直接的办法,就是不使用Maven来管理这个依赖,自己下载对应的jar包,然后在Maven的 build 标签中 配置编译的时候加入额外的第三方jar包的编译,这样就一定可以找到对应的jar包了, 也就不会发生找不到类的异常。
引入的第三方jar包如图,为Redisson框架的jar包

java.lang.NoClassDefFoundError错误产生的原因及解决方案(一种方案)_第1张图片
然后在配置Maven的 build 标签下的 plugin 标签时,添加额外的编译配置此项目中使用的是 webapp/WEB-INF/lib ,文件夹作为编译时需要额外进行编译加入的地方,也就是放第三方jar包的位置

            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.7
                    1.7
                    UTF-8
                    
                        ${project.basedir}/src/main/webapp/WEB-INF/lib
                    
                
            
        

最终这样配置后,解决了找不到类的问题,但是这样也导致项目中出现了中央仓库中已有的jar包, 不够完美。其他的解决方法以后再说吧。

你可能感兴趣的:(IDEA,Maven)