Search code examples
javaclassloaderurlclassloader

Got NoClassDefFoundError: wrong name with Windows path


I have a TEST123.class in the path below.

D:/Users/XXX/Desktop/sem-material-job/sem-material-job/sem-material-freemarkerjob/target/classes/com/ctrip/market/sem/freemarkerjob/dynamicjava/

Then I run the try clause below to load the class by URLClassLoader , however it give me the exception ava.lang.NoClassDefFoundError: TEST123 (wrong name:, how to solve the exception?

ava.lang.NoClassDefFoundError: TEST123 (wrong name: com/ctrip/market/sem/freemarkerjob/dynamicjava/TEST123)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)

   try {
                URLClassLoader mycl = new URLClassLoader(new URL[] { new URL(
                        "file:///D:/Users/XXX/Desktop/sem-material-job/sem-material-job/sem-material-freemarkerjob/target/classes/com/ctrip/market/sem/freemarkerjob/dynamicjava/") });
                Class c2 = mycl.loadClass("TEST123");
            } catch (Exception e) {
                e.printStackTrace();
            }

Solution

  • I think you have to change your URL to point to classpath and load class by package name, like this

    URLClassLoader mycl = new URLClassLoader(new URL[] { 
    new URL("file:///D:/Users/XXX/Desktop/sem-material-job/sem-material-‌​job/sem-material-fre‌​emarkerjob/target/cl‌​asses/") }); 
    
    Class c2 = mycl.loadClass("com.ctrip.market.sem.freemarkerjob.dynamicja‌​va.TEST123");