Java project gradle插件的加载类路径应用于

Java project gradle插件的加载类路径应用于,java,gradle,reflection,gradle-plugin,Java,Gradle,Reflection,Gradle Plugin,我正在编写一个定制的gradle插件,它将根据它在应用到的项目中找到的代码为我生成一些代码。 为此,我需要找到扩展特定类的所有类。 问题是被扩展的类没有加载到类路径中,因为它是另一个项目的依赖项 目前,我得到了我的自定义任务这个 public class GenerateCodeTask extends DefaultTask { @TaskAction public void generateCode() throws MalformedURLException, Class

我正在编写一个定制的gradle插件,它将根据它在应用到的项目中找到的代码为我生成一些代码。 为此,我需要找到扩展特定类的所有类。 问题是被扩展的类没有加载到类路径中,因为它是另一个项目的依赖项

目前,我得到了我的自定义任务这个

public class GenerateCodeTask extends DefaultTask {

    @TaskAction
    public void generateCode() throws MalformedURLException, ClassNotFoundException {
        File buildDir = new File(getProject().getBuildDir(), "classes/main");
        File root = new File(getProject().getProjectDir(), "src/main/generated");

        URLClassLoader classLoader = new URLClassLoader(new URL[]{buildDir.toURL()});
        Class itemClass = classLoader.loadClass("net.minecraft.item.Item");
        Reflections reflections = new Reflections(classLoader);
        Set<Class<?>> items = reflections.getSubTypesOf(itemClass);
    }
}
公共类GenerateCodeTask扩展了DefaultTask{
@任务行动
public void generateCode()引发错误的FormedUrlexception,ClassNotFoundException{
File buildDir=新文件(getProject().getBuildDir(),“classes/main”);
文件根=新文件(getProject().getProjectDir(),“src/main/generated”);
URLClassLoader classLoader=新的URLClassLoader(新的URL[]{buildDir.toURL()});
Class itemClass=classLoader.loadClass(“net.minecraft.item.item”);
反射=新反射(类加载器);

设置我想你几乎成功了

您需要
compileClasspath
属性。我将其作为输入参数传递给我的任务,并从中构建类加载器:

在插件中:

Set<File> ccp = project.getConfigurations().getByName("compileClasspath").getFiles();
task.classpath = ccp;
在第二种情况下,您只需将库作为dep添加到项目中,它就会找到该类

并重新布线任务,以确保在调用任务之前构建了第一个项目(就在第二个项目build.gradle的根级别):

我认为这是对你不起作用的部分,显然,compileJava和build并不完全相同。或者至少,compileJava对我也不起作用

myGeneratorTask.dependsOn( ":my_project_with_classes_to_extend:build" )
compileJava.dependsOn( "myGeneratorTask" )

感谢您发布您的信息,我会尝试这一点,一旦我得到我的手上的项目:)
@InputFiles
Iterable<File> classpath;
dependencies {
    compile project(':my_project_with_classes_to_extend')
}
myGeneratorTask.dependsOn( ":my_project_with_classes_to_extend:build" )
compileJava.dependsOn( "myGeneratorTask" )