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

标签 java gradle reflection gradle-plugin

我正在编写一个自定义 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 目录下生成的。 (所以不需要手动构建路径)
  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" )

关于java - 项目gradle插件的加载类路径应用于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50728907/

相关文章:

java - 我对输出感到困惑,因为它不允许我重新创建对象

java - Android SDK,检查设备是否为 Amazon-FireTV

Java:同步套接字输入

android - 在我重新安装 Android Studio 后,很多资源有点丢失

C# - 如何检查是否需要构造一个类型的对象?

c# - 复用接口(interface)方法调用到单个委托(delegate)中并解复用

java - 如何访问 java Derby 数据库?我确实需要一些有用的建议

gradle - 如何在intellij中打开带有子项目的项目以使intellisense工作

android - Android Gradle构建在 ':app:mergeDebugResources'上突然失败,没有错误消息

.net - CLR token 可以为零或负数