如何允许gradle插件访问项目依赖项中的类

时间:2017-10-19 15:00:45

标签: java gradle classpath jsonschema

我正在编写一个gradle插件,为我的项目中的bean生成<Setter Property="IsChecked" Value="{Binding IsOpen, ElementName=Popup, Mode=TwoWay}"/> 。我的目标是在构建过程中生成和发布架构,因此我不需要手动更新它。

目前,我将json-schema传递给我的任务并使用它来构建project.compileJava.inputs.files。然后我将这些课程传递给schema generator

为了确保正确生成json模式,我想使用目标应用程序中的URLClassLoader。不幸的是,我的ObjectMapper添加了杰克逊ObjectMapper在该模块的深处,它会尝试检查我的类是否可以分配给Hibernate5Module.并且因为HibernateProxy,已加载Gradle的类加载器和我的类加载了HibernateProxy一切爆炸。

我可以删除Hibernate模块,但是仍然会在其他类似的情况下触发bug,并且它使我的插件不易分发。所以我需要一种方法来在gradle的类路径中添加新条目,或者在运行时添加默认的类加载器。

供参考,以下是相关代码片段:

目标项目的build.gradle

URLClassLoader

公共类WriteJsonSchema扩展DefaultTask

jsonSchema {
    classpath = project.compileJava.inputs.files
}

TL; DR:我需要一种方法来将新条目添加到gradle的类路径或运行时的默认类加载器。

1 个答案:

答案 0 :(得分:4)

如果有人关心,我最终通过检查compilejava任务的输出来获取项目类路径。

classpath = getProject().files();
    getProject()
        .getTasksByName("compileJava", true)
        .forEach(task -> classpath = Classpath.plus(((JavaCompile)task).getClasspath()));
classpath = Classpath.plus(getProject().getTasks().getByName("jar").getOutputs().getFiles());