【问题标题】:Execute Java class with separate classpath from Gradle plugin使用来自 Gradle 插件的单独类路径执行 Java 类
【发布时间】:2014-03-25 21:20:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java gradle gradle-custom-plugin


    【解决方案1】:

    有几种方法可以用来调用外部 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。)

    【讨论】:

    • 谢谢彼得。仅供参考。我进入JavaExec(第 1 点),因为它很容易实现并满足我的需求。目前只需要调用一个 main 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多