Gradle插件,必须从项目中加载已编译的类

Gradle插件,必须从项目中加载已编译的类,gradle,Gradle,作为为编写Gradle插件的一部分,我们在处理Java迁移时遇到了一个问题 在项目编译类的类路径上提供Gradle插件访问权限的最佳方式是什么,以便加载和执行它们?因此,我们有一个插件,它添加了一个任务,希望执行插件应用到的项目中包含的代码。在这种情况下,任务(类)应该具有类型为Iterable的输入属性,该属性(由插件)使用要执行的代码的类路径进行配置(例如sourceset.main.runtimeClasspath)。然后,任务可以选择以下方式来执行代码: 该任务使用project.ja

作为为编写Gradle插件的一部分,我们在处理Java迁移时遇到了一个问题


在项目编译类的类路径上提供Gradle插件访问权限的最佳方式是什么,以便加载和执行它们?

因此,我们有一个插件,它添加了一个任务,希望执行插件应用到的项目中包含的代码。在这种情况下,任务(类)应该具有类型为
Iterable
的输入属性,该属性(由插件)使用要执行的代码的类路径进行配置(例如
sourceset.main.runtimeClasspath
)。然后,任务可以选择以下方式来执行代码:

  • 该任务使用
    project.javaexec{}
    在单独的JVM中执行代码。如果代码不是直接可执行的,任务可能需要将一些引导代码注入
    javaexec
    类路径。使用
    project.javaexec
    的一个潜在替代方法是首先使用
    javaexec
    任务
  • 该任务创建一个新的类加载器,用类路径填充它,加载和实例化充当API入口点的类,并在适当时使用它们。如果任务是用Groovy编写的,那么它可以利用duck类型,并且除了创建入口点之外,不需要反射代码

你的意思是,插件添加的任务需要执行插件应用到的项目的代码?是的,我不知道如何在不使用JavaExec或ProcessBuilder的情况下获得编译的类路径()。谢谢。你推荐哪一种?我也在考虑使用ant任务而不是JavaExec,但它们应该基本上是等价的代码。如果你喜欢第二种选择,你有没有第二种选择的例子?