【Linuxでの検証】Class#forNameはファイルシステムが大文字小文字の区別をしない場合にNoClassDefFoundErrorを投げることがある

# これは何？
[Class#forNameはファイルシステムが大文字小文字の区別をしない場合にNoClassDefFoundErrorを投げることがある](http://d.hatena.ne.jp/megascus/20160816/1471336748) を読んだので、Linuxだとどうなのか確認した。

# 環境
会社にあったLinux＆Java1.7

# テストコード
```java
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)
```

# 結論
ゆとりさんの推論通りでした。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/deaf_tadashi">@deaf_tadashi</a> Windowsのファイルシステムが大文字小文字を区別できないので、Errorになります。jarの中だと区別できるのでException。確かめてないですが、LinuxだとExceptionじゃないかなぁ。</p>&mdash; ゆとり (@megascus) <a href="https://twitter.com/megascus/status/765471725500772352">2016年8月16日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# その他
Windows＆Java7でも、test4()メソッドはNoClassDefFoundErrorになったのでJavaのバージョンは関係なさそう。