自定义java gradle插件中的反射

自定义java gradle插件中的反射,java,gradle,gradle-plugin,reflections,Java,Gradle,Gradle Plugin,Reflections,我有一个gradle项目,有多个模块,每个模块都构建到自己的.jar文件中。我想在一个定制的JavaGradle插件中使用反射来生成一个关于注释类/方法的报告 /build.gradle apply plugin: com.my.plugins.MyPlugin repositories { mavenCentral() } dependencies { compile 'org.reflections:reflections:0.9.11' compile 'jav

我有一个gradle项目,有多个模块,每个模块都构建到自己的.jar文件中。我想在一个定制的JavaGradle插件中使用反射来生成一个关于注释类/方法的报告

/build.gradle

apply plugin: com.my.plugins.MyPlugin
repositories {
    mavenCentral()
}

dependencies {
    compile 'org.reflections:reflections:0.9.11'
    compile 'javax.annotation:javax.annotation-api:1.3.2'
}
/buildSrc/build.gradle

apply plugin: com.my.plugins.MyPlugin
repositories {
    mavenCentral()
}

dependencies {
    compile 'org.reflections:reflections:0.9.11'
    compile 'javax.annotation:javax.annotation-api:1.3.2'
}
/buildSrc/src/main/java/com/my/plugins/MyPlugin.java

@NonNullApi
public class MyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        MyTask myTask = project.getTasks().create("mytask", MyTask.class);
        Task javaCompileTask = project.getTasks().getByName("compileJava");
        myTask.dependsOn(javaCompileTask);
    }
}
public class MyTask extends DefaultTask {

    @TaskAction
    public void perform() throws MalformedURLException, ClassNotFoundException {

        List<URL> listOfURL = new ArrayList<>();
        Set<File> runtimeFiles = getProject().getConfigurations().findByName("runtime").getFiles();
        for (File file : runtimeFiles) {
            // TODO: Exclude files from gradle cache folder
            if (file.getPath().contains("build\\libs")) {
                listOfURL.add(file.toURI().toURL());
            }
        }

        URL[] urls = listOfURL.toArray(new URL[0]);
        System.out.println("\nURLs:");
        for (URL u : urls) {
            System.out.println("  " + u.toString());
        }

        ClassLoader classLoader = new URLClassLoader(urls, null);
        classLoader.loadClass("com.my.services.sample.MyClass");
        System.out.println("\nClassLoader OK!\n");

        Configuration config = new ConfigurationBuilder()
            .setUrls(ClasspathHelper.forClassLoader(classLoader))
            .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("com.my.services")))
            .addClassLoader(classLoader)
            .setScanners(new SubTypesScanner(),
                    new TypeAnnotationsScanner(),
                    new MethodAnnotationsScanner());

        Reflections reflections = new Reflections(config);

        System.out.println("\nPermitAll Classes\n");
        for (Class c : reflections.getTypesAnnotatedWith(PermitAll.class)) {
            System.out.println(c.getName());
        }

        System.out.println("\nPermitAll Methods\n");
        for (Method m : reflections.getMethodsAnnotatedWith(PermitAll.class)) {
            System.out.println(m.getName());
        }

    }
}
@NonNullApi
公共类MyPlugin实现插件{
@凌驾
公开作废申请(项目){
MyTask MyTask=project.getTasks().create(“MyTask”,MyTask.class);
任务javaCompileTask=project.getTasks().getByName(“compileJava”);
dependsOn(javaCompileTask);
}
}
/buildSrc/src/main/java/com/my/plugins/MyTask.java

@NonNullApi
public class MyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        MyTask myTask = project.getTasks().create("mytask", MyTask.class);
        Task javaCompileTask = project.getTasks().getByName("compileJava");
        myTask.dependsOn(javaCompileTask);
    }
}
public class MyTask extends DefaultTask {

    @TaskAction
    public void perform() throws MalformedURLException, ClassNotFoundException {

        List<URL> listOfURL = new ArrayList<>();
        Set<File> runtimeFiles = getProject().getConfigurations().findByName("runtime").getFiles();
        for (File file : runtimeFiles) {
            // TODO: Exclude files from gradle cache folder
            if (file.getPath().contains("build\\libs")) {
                listOfURL.add(file.toURI().toURL());
            }
        }

        URL[] urls = listOfURL.toArray(new URL[0]);
        System.out.println("\nURLs:");
        for (URL u : urls) {
            System.out.println("  " + u.toString());
        }

        ClassLoader classLoader = new URLClassLoader(urls, null);
        classLoader.loadClass("com.my.services.sample.MyClass");
        System.out.println("\nClassLoader OK!\n");

        Configuration config = new ConfigurationBuilder()
            .setUrls(ClasspathHelper.forClassLoader(classLoader))
            .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("com.my.services")))
            .addClassLoader(classLoader)
            .setScanners(new SubTypesScanner(),
                    new TypeAnnotationsScanner(),
                    new MethodAnnotationsScanner());

        Reflections reflections = new Reflections(config);

        System.out.println("\nPermitAll Classes\n");
        for (Class c : reflections.getTypesAnnotatedWith(PermitAll.class)) {
            System.out.println(c.getName());
        }

        System.out.println("\nPermitAll Methods\n");
        for (Method m : reflections.getMethodsAnnotatedWith(PermitAll.class)) {
            System.out.println(m.getName());
        }

    }
}
公共类MyTask扩展了DefaultTask{
@任务行动
public void perform()引发畸形的DurLexException,ClassNotFoundException{
List listOfURL=new ArrayList();
设置runtimeFiles=getProject().getConfigurations().findByName(“运行时”).getFiles();
for(文件:运行时文件){
//TODO:从gradle缓存文件夹中排除文件
if(file.getPath()包含(“build\\libs”)){
添加(file.toURI().toul());
}
}
URL[]URL=listofull.toArray(新URL[0]);
System.out.println(“\nURLs:”);
用于(URL u:URL){
System.out.println(“+u.toString());
}
ClassLoader ClassLoader=新的URLClassLoader(URL,null);
loadClass(“com.my.services.sample.MyClass”);
System.out.println(“\n类装入器正常!\n”);
Configuration config=new ConfigurationBuilder()
.setURL(ClasspathHelper.forClassLoader(classLoader))
.filterInputsBy(新的FilterBuilder().include(FilterBuilder.prefix(“com.my.services”))
.addClassLoader(类加载器)
.setScanners(新的子扫描程序(),
新类型AnnotationsCanner(),
新方法AnnotationsCanner());
反射=新反射(配置);
System.out.println(“\n终止类\n”);
for(c类:reflections.getTypesAnnotatedWith(PermitAll.Class)){
System.out.println(c.getName());
}
System.out.println(“\n终止方法\n”);
对于(方法m:reflections.getMethodsAnnotatedWith(PermitAll.class)){
System.out.println(m.getName());
}
}
}
当我运行gradlew mytask时,我会在URL列表中看到build\libs下所有.jar文件的列表

尽管classLoader可以成功加载(例如)MyClass,但新的Reflections()行会生成许多“无法获取名称的类型”错误,例如:

无法从任何类加载器获取名称com.my.services.sample.MyClass的类型

然后,正确生成PermitAll类列表,但PermitAll方法列表失败,出现异常,例如:

任务“:mytask”的执行失败

>org/dom4j/DocumentException

我已经使用以下内容作为指导,但无法取得任何进一步的进展:


您应该使用以下命令来创建类加载器

URL[] urls = project.sourceSets.main.runtimeClasspath.files.collect {
    it.toURI().toURL()
} as URL[]
ClassLoader classloader = new URLClassLoader(urls, null)