Java ReflectionException:无法获取名称org.gradle.api.Plugin的类型

Java ReflectionException:无法获取名称org.gradle.api.Plugin的类型,java,gradle,gradle-plugin,Java,Gradle,Gradle Plugin,我已经实现了定制的Gradle插件,它可以工作,但是在Gradle构建期间,我遇到了一个ReflectionException:由于反射扫描,无法获取org.Gradle.api.plugin的类型。为什么类加载器看不到类型 Caused by: java.lang.ClassNotFoundException: org.gradle.api.Plugin at java.net.URLClassLoader.findClass(URLClassLoader.java:382)

我已经实现了定制的Gradle插件,它可以工作,但是在Gradle构建期间,我遇到了一个
ReflectionException:由于反射扫描,无法获取org.Gradle.api.plugin的类型。为什么类加载器看不到类型

Caused by: java.lang.ClassNotFoundException: org.gradle.api.Plugin
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.reflections.ReflectionUtils.forName(ReflectionUtils.java:388)
自定义插件实现
插件
,如下所示:

//CommonGradlePlugin
import org.gradle.api.Plugin;
import org.gradle.api.Project; 

public class CommonGradlePlugin implements Plugin<Project> {
    //...
}
//CommonGradlePlugin
导入org.gradle.api.Plugin;
导入org.gradle.api.Project;
公共类CommonGradlePlugin实现插件{
//...
}
为什么类加载器看不到类型

我假设gradle类不包括在编译/运行时类路径中,只是因为它是一个构建工具。这就是为什么gradle类无法通过反射找到

您可以使用Reflection的ConfigurationBuilder排除带有gradle插件的软件包:

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
FilterBuilder filterBuilder = new FilterBuilder();

configurationBuilder.addUrls(ClasspathHelper.forPackage(PACKAGE_TO_SCAN));
filterBuilder
        .includePackage(PACKAGE_TO_SCAN)
        .excludePackage(PACKAGE_TO_EXCLUDE);
configurationBuilder.filterInputsBy(filterBuilder);

Reflections reflections = new Reflections(configurationBuilder);

在我的例子中,它是有效的,但由于许多地方都有反射用法,我认为最好是简单地将带有gradle内容的包从基本包中移出。同样,也可以添加gradle API依赖项,如下所示:
implementation gradleApi()