Gradle插件任务反射将扫描插件的项目类文件而不是当前项目文件

问题描述 投票:0回答:2

我创建了一个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;
    }
java gradle reflection annotations guava
2个回答
1
投票

这无法按照您期望的方式工作:

  1. 默认情况下,Gradle不会在构建项目时加载您的项目类文件。它们将通过编译产生,通过测试执行等加载,但是通常不作为Gradle执行任务的一部分。
  2. 当您的插件接触到类加载器时,它位于托管的Gradle世界中,它对类加载器有其自己的技巧。因此,您必须了解哪些技巧已被拉出...但是给定1,那仍然不起作用。

鉴于您的尝试看起来很像annotation processing,因此您应该研究处理需求的方法。


0
投票

在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);
© www.soinside.com 2019 - 2024. All rights reserved.