使用Gradle插件中的单独类路径执行Java类

时间:2014-03-25 21:20:05

标签: java gradle gradle-custom-plugin

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

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

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

不过,我宁愿不使用Ant任务,因为它是一个单独的项目和另一层抽象及其潜在的缺陷和限制。

1 个答案:

答案 0 :(得分:2)

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

  1. 使用JavaExec任务或利用project.javaexec方法的自定义任务。
  2. 将外部Jar放在构建脚本类路径上,并直接或从自定义任务中反射性地调用其主方法。外部Jar可能是插件Jar的传递依赖。或者,可以让用户将外部Jar放在构建脚本类路径(buildscript { dependencies { classpath ... } })上。
  3. 编写一个自定义任务,创建自己的类加载器,将外部Jar放在其上,并反射调用其主方法。
  4. 第一种方法是在单独的JVM中运行代码,这通常是可取的。第二种和第三种方法也可以调用除主要方法之外的方法。在第一种或第三种方法中,插件可以添加一种配置,允许用户通过在dependencies块中声明依赖性来提供外部Jar。 (该插件可以提供默认依赖项。)这是许多内置Gradle插件所做的事情,例如代码质量插件(checkstyle等)。您可能希望研究他们的代码以获得一些灵感。

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

相关问题