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
任务与来自类路径上的编译任务的 类 结合使用。
我写了一个 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
任务与来自类路径上的编译任务的 类 结合使用。