Gradle 需要访问源的自定义插件

Gradle custom plugin which needs to access sources

我写了一个 gradle 插件,我确实希望在其中访问项目的源代码并生成一些文件。当我 运行 我的项目来自 Java 时一切正常,但是当我尝试通过插件做同样的事情时它不起作用。它看不到项目的来源。

在 gradle 中,源代码对构建脚本不可见,因此对插件也不可见,这是真的吗?是否可以让它们可用于插件?

此class用于获取classes的列表。

public class ClassFinder {
    private final List<? extends Class<?>> classes;

    public ClassFinder(String packageToScan) {
        ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
        provider.addIncludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*")));
        Set<BeanDefinition> classes = provider.findCandidateComponents(packageToScan);

        this.classes = classes.stream()
                .map(bean -> {
                    try {
                        return Class.forName(bean.getBeanClassName());
                    } catch (ClassNotFoundException e) {
                        throw new IllegalStateException(e);
                    }
                })
                .collect(Collectors.toList());
    }

    ...
}

我可以在 main 方法或插件中使用它。在 main 中,它找到了我当前项目中的所有 classes。在插件中它没有找到任何东西(库除外)。

您指的不是源文件,而是已经编译类在当前类路径中。由于 Gradle 编译了那些 类,很明显它们不能出现在 Gradle 运行时及其插件的类路径中。因此,不可能 从 Gradle 插件中收集生产代码的 类。但是,可以使用 Gradle 从 Gradle 调用您的功能,方法是将 JavaExec 任务与来自类路径上的编译任务的 类 结合使用。