これは何?
Class#forNameはファイルシステムが大文字小文字の区別をしない場合にNoClassDefFoundErrorを投げることがある を読んだので、Linuxだとどうなのか確認した。
環境
会社にあったLinux&Java1.7
テストコード
package test;
public class TestMain {
public static void main(String[] args) {
try {
test1();
} catch(Exception e) {
e.printStackTrace();
}
try {
test2();
} catch(Exception e) {
e.printStackTrace();
}
try {
test3();
} catch(Exception e) {
e.printStackTrace();
}
try {
test4();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void test1() throws ClassNotFoundException {
Class.forName("test.TestMain");// このクラスを呼び出す
}
public static void test2() throws ClassNotFoundException {
Class.forName("java.lang.Thread");// rt.jarに入っているクラスを呼び出す
}
public static void test3() throws ClassNotFoundException {
Class.forName("java.lang.thread");// rt.jarに入ってるクラスの大文字小文字の間違い
}
public static void test4() throws ClassNotFoundException {
Class.forName("test.testmain");// このクラスの大文字小文字の間違い
}
}
結果
[aaaa@bbbb /cccc/]%java test.TestMain
java.lang.ClassNotFoundException: java.lang.thread
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at test.TestMain.test3(TestMain.java:39)
at test.TestMain.main(TestMain.java:18)
java.lang.ClassNotFoundException: test.testmain
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at test.TestMain.test4(TestMain.java:43)
at test.TestMain.main(TestMain.java:23)
結論
ゆとりさんの推論通りでした。
@deaf_tadashi Windowsのファイルシステムが大文字小文字を区別できないので、Errorになります。jarの中だと区別できるのでException。確かめてないですが、LinuxだとExceptionじゃないかなぁ。
— ゆとり (@megascus) 2016年8月16日
その他
Windows&Java7でも、test4()メソッドはNoClassDefFoundErrorになったのでJavaのバージョンは関係なさそう。