我创建了一个Gradle插件,该插件可扫描项目中的类文件并查找具有注释的文件。
我让它工作并进行编译。现在,当我在项目中运行任务时,它不会扫描我所在项目的类并在其上运行任务,而是会扫描插件项目本身的类文件。我在做什么错?
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try {
ClassPath classpath = ClassPath.from(loader); // scans the class path used by classloader
log.info("classPath = {}", classpath);
for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClassesRecursive(packageName)) {
log.info("classInfo={}", classInfo);
Class<?> clazz = classInfo.load();
if (clazz.isAnnotationPresent(RestController.class)) {
Method[] methods = clazz.getMethods();
for (Method method : methods) {
doSomething(clazz, method);
}
}
}
} catch (IOException | NoSuchFieldException | IllegalAccessException ex) {
String errorMsg = new StringBuilder("Unable to generate ").append(propertiesFileName).append(" file.").toString();
log.error(errorMsg, ex);
throw ex;
}
这无法按照您期望的方式工作:
鉴于您的尝试看起来很像annotation processing,因此您应该研究处理需求的方法。
在Gradle论坛上进行了大量挖掘,尽管如此,我仍然遇到很多问题,但这是我能找到的最佳解决方案:
URL[] urls;
List<URL> listOfURL = new ArrayList<>();
SourceSetContainer ssc = getProject().getConvention().getPlugin(JavaPluginConvention.class).getSourceSets();
File classesDir = ssc.getByName("main").getOutput().getClassesDir();
listOfURL.add(classesDir.toURI().toURL());
urls = listOfURL.toArray(new URL[0]);
final ClassLoader loader = new URLClassLoader(urls);