繁体   English   中英

将项目gradle插件的加载类路径应用于

[英]Load classpath of project gradle plugin is applied to

我正在编写一个自定义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);
    }
}

而这个插件

public class EasymodsPlugin implements Plugin<Project> {
    @Override
    public void apply(Project p) {
        Task t = p.getTasks().create("generateCode", GenerateCodeTask.class);

        t.dependsOn(p.getTasks().getByPath("compileJava"));
    }
}

这是我得到的错误

java.lang.ClassNotFoundException:net.minecraft.item.Item

我知道问题是没有包含该类的库,这会导致异常。 我想要的是能够将项目的所有依赖项加载到类加载器中,因此我可以使用反射来找到项目中的所有“项目”(我需要生成代码)

问候失败者

我想你差不多了。

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

在插件中:

Set<File> ccp = project.getConfigurations().getByName("compileClasspath").getFiles();
task.classpath = ccp;

在任务中:

@InputFiles
Iterable<File> classpath;

该属性添加的是:

  1. project_id/build dir下生成的项目所依赖的类的路径。 (因此,无需手动构建路径)
  2. 您的项目的所有库部门。 我以为你不见了。

因此,如果您的班级是类型1:

最好有不同的子项目:一个拥有原始类,另一个拥有生成的子类。

因此,第二个取决于第一个:

dependencies {
    compile project(':my_project_with_classes_to_extend')
}

如果是第二种,则只需将库作为dep添加到项目中,它将找到该类。

并重新连接任务,以便在调用任务之前确定第一个项目已构建(仅在第二个项目build.gradle的根级别):

我认为那不是真正为您服务的部分,显然,compileJava和build并不完全相同。 至少,compileJava也不适合我。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM