В весеннем проекте я получил следующие занятия:
interface IStep {
IStep doStep();
String getName();
}
@Component
public class Step1 implements IStep {
public final static String NAME = "STEP1";
...
}
@Component
public class Step1 implements IStep {
...
}
На основе этого проекта создается jar.
Используя простой Java-проект, я пытаюсь загрузить jar для анализа зависимостей между классы и создать несколько диаграмм. Мой первый вариант использования — найти все классы, реализующие IStep, и получить их имена.
Я пытаюсь использовать отражение, чтобы загрузить jar, получить классы и загрузить их. Однако я продолжаю получать сообщение об ошибке noclassdeffounderror на шаге 1. Когда я удаляю аннотацию @Component, все работает нормально. Как загрузить класс, не удаляя аннотацию?
JarFile jarFile = new JarFile(pathToJar);
Enumeration e = jarFile.entries();
URL[] urls = { new URL("jar:file:" + pathToJar+"!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls);
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
if(je.isDirectory() || !je.getName().endsWith(".class") || !je.getName().contains("mypackagename")){
continue;
}
// -6 because of .class
String className = je.getName().substring(0,je.getName().length()-6);
className = className.replace('/', '.');
Class c = cl.loadClass(className); //noclassdeffounderror
}
Подробнее здесь: https://stackoverflow.com/questions/782 ... spring-jar