【Java】NoClassDefFoundError的常见缘故

工作中碰见一个关于NoClassDefFoundError的错误,纠错和调试了许久,终于解决,特意记录下。

我碰见的错误如下所示:

1
2
3
4
5
2018-02-28 14:52:50,298 ERROR [com.cc.aop.ResponseBodyAround] - <Could not initialize class com.cc.cache.redis.util.RedisSessionUtil>
java.lang.NoClassDefFoundError:Could not initialize class com.cc.cache.redis.util.RedisSessionUtil
at com.cc.shiro.session.RedisSessionDAO.doCreate(RedisSessionDAO.java:60)
at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.create(AbstractSessionDAO.java:116)
at org.apache.shiro.session.mgt.DefaultSessionManager.create(DefaultSessionManager.java:177)

发生错误的关键代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
public final class RedisSessionUtil {
private static ShardedJedisPool pool = null;
static {
Properties p = new Properties();
try {
p.load(RedisSessionUtil.class.getClassLoader().getResourceAsStream("config/session.properties"));
} catch (IOException var18) {
throw new RuntimeException("config/session.properties not config ~");
}
...
}
...
}

以下就叙述如何解决NoClassDefFoundError错误与发生该错误的几种常见情况。

  • 错误根本原因。

    • Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。
    • 它与ClassNotFoundException不同,该错误是运行时需要加载对应的类不成功,而不是编译时发生。简而言之,大部分情况为缺少jar包所致。
  • 常见发生情况。
    • 缺少jar包。
    • jar包冲突。
    • 静态代码块出现异常
    • jdk版本问题

而我碰见的问题属于静态代码块出现异常导致无法初始化所造成的,后经查明,发生错误的关键代码如下所示:

1
p.load(RedisSessionUtil.class.getClassLoader().getResourceAsStream("config/session.properties"));

其中的 session.properties 该配置文件未放置在 config 文件夹中所导致的。