在ubuntu下添加LD_LIBRARY_PATH。添加方法:sudo gedit /etc/environment . 打开的文件里输入:LD_LIBRARY_PATH=“你的路径”,然后保存关闭,使用source /etc/environemnt 立即生效。注意:这里虽然是立即生效,但是只是一个终端下生效,一旦新打开一个终端,输入echo $LD_LIBRARY_PATH,又会看到不存在那个路径。有效的生效方式是重新启动ubuntu。
NoClassDefFoundError产生的原因有好几种,这里记录静态变量或静态块引起的。具体抛出的异常类似:
java.lang.NoClassDefFoundError: Could not initialize class xxx
JVM在加载类的时候,会初始化类里的静态变量,或执行静态块,如果这个时候抛出了异常,该类就会加载失败,那么以后任何使用到这个类的地方,都会抛出NoClassDefFoundError异常,如下面的例子:
public class TestNoClassDefFoundError {
public static void main(String[] args) throws InterruptedException {
TestNoClassDefFoundError sample = new TestNoClassDefFoundError();
sample.getClassWithInitErrors();
}
private void getClassWithInitErrors() throws InterruptedException {
System.out.println("第一次new");
Thread.sleep(500);
try {
//第一次new ClassWithInitErrors类,JVM会加载该类,初始化该类的静态变量或执行静态块
new ClassWithInitErrors();
} catch (Throwable t) {
//因为初始化静态变量失败,所以加载类失败。
t.printStackTrace();
}
Thread.sleep(500);
System.out.println("-----------------------------------------------------");
System.out.println("第二次new");
Thread.sleep(500);
try {
//第二次new ClassWithInitErrors类,JVM不会再加载该类,而是抛出NoClassDefFoundError异常
new ClassWithInitErrors();
} catch (Throwable t) {
t.printStackTrace();
}
Thread.sleep(500);
System.out.println("-----------------------------------------------------");
System.out.println("第三次new");
Thread.sleep(500);
try {
//第三次new ClassWithInitErrors类,JVM不会再加载该类,而是抛出NoClassDefFoundError异常
new ClassWithInitErrors();
} catch (Throwable t) {
t.printStackTrace();
}
}
}
class ClassWithInitErrors {
static int data = 1 / 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
执行结果如下:
第一次new
java.lang.ExceptionInInitializerError
at TestNoClassDefFoundError.getClassWithInitErrors(TestNoClassDefFoundError.java:12)
at TestNoClassDefFoundError.main(TestNoClassDefFoundError.java:4)
Caused by: java.lang.ArithmeticException: / by zero
at ClassWithInitErrors.(TestNoClassDefFoundError.java:42)
... 2 more
第二次new
java.lang.NoClassDefFoundError: Could not initialize class ClassWithInitErrors
at TestNoClassDefFoundError.getClassWithInitErrors(TestNoClassDefFoundError.java:24)
at TestNoClassDefFoundError.main(TestNoClassDefFoundError.java:4)
第三次new
java.lang.NoClassDefFoundError: Could not initialize class ClassWithInitErrors
at TestNoClassDefFoundError.getClassWithInitErrors(TestNoClassDefFoundError.java:34)
at TestNoClassDefFoundError.main(TestNoClassDefFoundError.java:4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上述代码,第二次及以后使用到ClassWithInitErrors类的地方,都只会抛出NoClassDefFoundError错误,而且通常我们查看日志的时候,都会先看最新的日志,所以就不容易找到加载类失败的真正原因,对于这种情况,我们应该搜索java.lang.ExceptionInInitializerError错误,找到第一次加载类的时候的日志,才能看到失败的原因。