Получил ошибку 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: 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();
            }
  

Комментарии:

1. Похоже, что существует конфликт классов Java. Существует две или более реализации класса URLClassLoader. Пожалуйста, проверьте, что в разных банках может быть две реализации.

2. URLClassLoader взят из пакета java.net.URLClassLoader; поэтому должна быть одна реализация. из сообщения об ошибке «NoClassDefFoundError: TEST123 (неправильное имя:», кажется, что указанный мной путь неверен, однако я не знаю, как это исправить.

3. добавьте url до target / classes и используйте полное имя класса для загрузки класса

4. Исключение, возникающее при запуске в строке Class c2 = myc.loadClass(«TEST123»);

5. Я думаю, вам нужно изменить свой URL-адрес, чтобы указывать на classpath и загружать класс по имени пакета, вот так 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"); Если это сработает, спасибо, что сказали мне изменить этот комментарий в ответе

Ответ №1:

Я думаю, вам нужно изменить свой URL, чтобы указывать на classpath и загружать класс по имени пакета, вот так

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

Комментарии:

1. Если мы можем изменить абсолютный путь file:///D:/Users/XXX/Desktop/sem-material-job/sem-material-job/sem-material-freemarkerjob/target/classes / к связанному пути, поскольку мы должны запустить программу в Linux, поэтому путь Windows D:/Users/XXX / .. недопустимо.

2. это зависит от ваших потребностей, существуют разные способы задать путь, связанный с plateforme.

Ответ №2:

Вы пытаетесь загрузить класс, TEST123 но ваш TEST123.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");
  

Должно сработать.

Комментарии:

1. Да, вы и andolsi дали правильный ответ, большое вам спасибо.