概述
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错误产生的原因及解决方案(一种方案)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复