我是靠谱客的博主 孝顺小笼包,最近开发中收集的这篇文章主要介绍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中的依赖配置

  <dependency>
   <groupId>org.redisson</groupId>
    <artifactId>redisson-all</artifactId>
       <version>2.8.1</version>
    </dependency>
   <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-avro</artifactId>
        <version>2.9.0</version>
    </dependency>

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

方案二(奏效)

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

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

在这里插入图片描述
然后在配置Maven的 build 标签下的 plugin 标签时,添加额外的编译配置此项目中使用的是 webapp/WEB-INF/lib ,文件夹作为编译时需要额外进行编译加入的地方,也就是放第三方jar包的位置

            <!-- geelynote maven的核心插件之-complier插件默认只支持编译Java 1.4,因此需要加上支持高版本jre的配置,在pom.xml里面加上 增加编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                    <compilerArguments>
                        <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
                    </compilerArguments>
                </configuration>
            </plugin>
        </plugins>

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

最后

以上就是孝顺小笼包为你收集整理的java.lang.NoClassDefFoundError错误产生的原因及解决方案(一种方案)的全部内容,希望文章能够帮你解决java.lang.NoClassDefFoundError错误产生的原因及解决方案(一种方案)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部