Я пытаюсь создать собственный плагин Gradle, который читает все классы на основе аннотации. Мой urlclassloader работает, основываясь на базовом пакете, который я предоставляю вместе с плагином, но когда я использую функцию getMethods (), я получаю ClassNotFoundException.
Это связано с тем, что некоторые методы имеют параметры, которые находятся в сторонних зависимостях. Есть ли способ использовать все зависимости проекта, который использует плагин? Я хочу десериализовать их, используя объект-маппер.
Мой код:
@TaskAction
public void generateRaml() throws MalformedURLException, ClassNotFoundException {
SourceSetContainer ssc = getProject().getConvention().getPlugin(JavaPluginConvention.class).getSourceSets();
File classesDir = ssc.getByName("main").getOutput().getClassesDirs().getSingleFile();
URL[] urls = new URL[] { classesDir.toURI().toURL() };
ClassLoader classLoader = new URLClassLoader(urls, null);
ResourceLoader resourceLoader = new DefaultResourceLoader(classLoader);
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
provider.setResourceLoader(resourceLoader);
provider.addIncludeFilter(new AnnotationTypeFilter(Controller.class));
provider.addIncludeFilter(new AnnotationTypeFilter(RestController.class));
Set<BeanDefinition> components = provider.findCandidateComponents(getBasePackage());
System.out.println("Found " + components.size() + " components");
for (BeanDefinition component : components) {
System.out.println("Component " + component.getBeanClassName());
Class<?> componentClass = Class.forName(component.getBeanClassName(), false, classLoader);
System.out.println("Class: " + componentClass.getName());
Method[] methods = componentClass.getDeclaredMethods();
System.out.println("Methods: " + methods.length);
}
Плагины не работают, когда я использую "componentClass.getDeclaredMethods ()"