Java 获取NoClassDefFoundError:Windows路径的名称错误

Java 获取NoClassDefFoundError:Windows路径的名称错误,java,classloader,urlclassloader,Java,Classloader,Urlclassloader,我在下面的路径中有一个TEST123.class D:/Users/XXX/Desktop/sem material job/sem material job/sem material freemarkerjob/target/classes/com/ctrip/market/sem/freemarkerjob/dynamicjava/ 然后,我运行下面的try子句以通过URLClassLoader加载该类,但是它给了我异常ava.lang.NoClassDefFoundError:TEST12

我在下面的路径中有一个TEST123.class

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

然后,我运行下面的try子句以通过URLClassLoader加载该类,但是它给了我异常ava.lang.NoClassDefFoundError:TEST123(错误名称:),如何解决该异常

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();
            }

您正试图加载class
TEST123
,但您的
TEST123.class
文件包含class
com.ctrip.market.sem.freemarkerjob.dynamicjava.TEST123
。将代码更改为

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

应该可以工作。

您正在尝试加载class
TEST123
,但是您的
TEST123.class
文件包含class
com.ctrip.market.sem.freemarkerjob.dynamicjava.TEST123
TEST123.java
第一行的包是什么?将代码更改为

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

应该可以工作。

我认为您必须更改URL以指向类路径并按包名加载类,如下所示

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");

我认为您必须更改URL以指向类路径,并按包名加载类,如下所示

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");

似乎存在java类的冲突。类URLClassLoader有两个或多个实现。请检查在不同的JAR中可能有两个实现。URLClassLoader来自包java.net.URLClassLoader;因此应该有一个实现。错误消息“NoClassDefFoundError:TEST123(错误名称:”,似乎我指定的路径是错误的,但是我不知道如何将其修复。addurl升级到目标/类,并使用完全限定的类名加载类。当在class c2=mycl.loadClass(“TEST123”)行运行时,会引发异常;我认为您必须更改URL以指向类路径并按包名加载类,如下面的
URLClassLoader mycl=newurlclassloader(newURL[]{newURL()file:///D:/Users/XXX/Desktop/sem-材料作业/sem材料作业/sem材料自由标记作业/target/classes/”)});类别c2=mycl.loadClass(“com.ctrip.market.sem.freemarkerjob.dynamicjava.TEST123”)
如果有效,感谢您告诉我在回答中更改此注释似乎存在java类的冲突。类URLClassLoader有两个或多个实现。请检查在不同的JAR中可能有两个实现。URLClassLoader来自包java.net.URLClassLoader;因此应该有一个实现。从错误消息“NoClassDefFoundError:TEST123(错误名称:”,看起来我指定的路径是错误的,但是我不知道如何修复它。将URL添加到目标/类,并使用完全限定的类名加载类。在class c2=mycl.loadClass(“TEST123”)行运行时会引发异常;我认为您必须更改URL以指向类路径并按包名加载类,如下面的
URLClassLoader mycl=newurlclassloader(newURL[]{newURL()file:///D:/Users/XXX/Desktop/sem-材料作业/sem材料作业/sem材料自由标记作业/target/classes/”));类别c2=mycl.loadClass(“com.ctrip.market.sem.freemarkerjob.dynamicjava.TEST123“)
如果它有效,谢谢你告诉我在回答中更改此评论是的,你和Androlsi给出了正确的答案,非常感谢。是的,你和Androlsi给出了正确的答案,非常感谢。如果我们可以更改路径file:///D:/Users/XXX/Desktop/sem-材料作业/sem材料作业/sem材料自由标记作业/目标/类别es/到相关路径,因为我们必须将程序运行到Linux,所以Windows路径D:/Users/XXX/。无效。这取决于您的需要,有不同的方法来设置与Platforme相关的路径。如果我们可以更改绝对路径file:///D:/Users/XXX/Desktop/sem-材料作业/sem材料作业/sem材料自由标记作业/目标/类别/关联d路径,因为我们必须在Linux上运行程序,所以Windows路径d:/Users/XXX/。无效。这取决于您的需要,有不同的方法来设置与Platforme相关的路径。