2

在我的插件中,我需要从外部 JAR 执行静态引导方法来执行分析。目前我直接从代码中调用它MutationCoverageReport.main(arg),但这迫使我在我的插件中创建一个编译时依赖项,在执行插件时很难修改(选择不同的 JAR 版本)。

我想使用反射来调用它,并在 Gradle 代码中找到了一些示例,例如WorkerProcessBuilderor JavaExecHandleBuilder。不过它们在org.gradle.process.internal包中,我不确定是否建议从外部插件中使用它。

问题。Gradle 插件从具有指定类路径的外部类运行任意 Java 方法的推荐方法是什么?

顺便说一句,我宁愿不使用Ant任务,因为它是一个单独的项目和另一个抽象层,具有潜在的错误和限制。

4

1 回答 1

2

有几种方法可以用来调用外部 Jar 中的 main 方法:

  1. 使用JavaExec任务或利用该project.javaexec方法的自定义任务。
  2. 将外部 Jar 放在构建脚本类路径上,并直接或从自定义任务反射调用其 main 方法。外部 Jar 可以是插件 Jar 的传递依赖。或者,可以让用户将外部 Jar 放在构建脚本类路径 ( buildscript { dependencies { classpath ... } }) 上。
  3. 编写一个自定义任务,创建自己的类加载器,将外部 Jar 放在其上,并反射性地调用其 main 方法。

第一种方法将在单独的 JVM 中运行代码,这通常是可取的。第二种和第三种方法也可以调用除 main 方法之外的方法。dependencies在第一种或第三种方法中,插件可以添加一个配置,允许用户通过在块中声明依赖项来提供外部 Jar 。(该插件可以提供默认依赖项。)这是许多内置 Gradle 插件所做的,例如代码质量插件(checkstyle等)。您可能想研究他们的代码以获得一些灵感。

外部插件应该只使用 Gradle 的公共 API 中的类,即记录在JavadocGroovydoc中的类。(并非所有内部类都包含internal在包名中。)

于 2014-03-26T01:44:17.533 回答