#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-freemarkerjob/target/classes/") });
Class c2 = mycl.loadClass("com.ctrip.market.sem.freemarkerjob.dynamicjava.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 дали правильный ответ, большое вам спасибо.