【问题标题】:How to allow user to change the version of the library which is used by a plugin in Gradle?如何允许用户更改 Gradle 中插件使用的库版本?
【发布时间】:2014-03-22 23:09:20
【问题描述】:

在我的plugin 中,我从一个库中调用静态引导方法MutationCoverageReport.main(arg),该库是我的插件的编译依赖项。我想允许插件用户更改应该使用的库版本(假设所选版本具有兼容的 API)。

我可以建议用户从我的插件中排除传递依赖,并在他的 build.gradle 中手动将请求版本中的库添加到 buildscript.dependencies.classpath,但这不是很优雅:

buildscript {
    (...)
    dependencies {
        classpath('info.solidsoft.gradle.pitest:gradle-pitest-plugin:0.32.0') {
            exclude(group: 'org.pitest')
        }
        classpath 'org.pitest:pitest-command-line:0.33'
    }
}

我希望能够在我的配置闭包中使用 libVersion 参数,但是我尝试了两种解决方案时遇到了一些问题。

1. 我可能需要从我的插件(原始库版本及其依赖项)中删除传递依赖项,并在请求版本(来自配置闭包)中添加一个库作为构建脚本依赖项。

在 afterEvaluate 中为时已晚(配置已解决),我无法成功挂钩 beforeEvaluate(是否为单个模块项目触发?)。

2. 我可以更改用于从库中执行静态方法的类路径。

为此,我可以创建一个自定义类加载器,它会在委托给父类加载器之前使用我的库类(在请求的版本中)。我还必须使用新的类加载器用反射调用替换一个带有MutationCoverageReport.main(arg) 的衬里。

也许有一种更简单的方法可以通过调用上述方法的插件来修改类路径?

主要问题。允许插件用户定义插件执行的库版本的最佳方法是什么?

【问题讨论】:

    标签: java gradle classpath gradle-custom-plugin


    【解决方案1】:

    我不确定这是您要查找的内容,但以下是 Jacoco 插件允许用户配置正在使用的库的方式。

    JacocoPluginExtension

    class JacocoPluginExtension {
        // ...
        String toolVersion = '0.32.0'
        // ...
    }
    

    JacocoPlugin

    class JacocoPlugin implements Plugin<Project> {
        // ...
        config.dependencies.add(this.project.dependencies.create("org.jacoco:org.jacoco.ant:${extension.toolVersion}"))
        // ...
    }
    

    【讨论】:

    • 感谢您的想法。不幸的是,我已经向我的自定义配置添加了一个依赖项,该类路径稍后作为参数传递给库,但与您的 JacocoPlugin 不同,我直接从库中获取 call main() 而不是使用 Ant(也许我会帮助我)。因此,我需要向buildscript.classpath 添加一个依赖项(以影响我从插件调用)。不幸的是,构造 project.buildscript.configurations.classpath.incoming.beforeResolve {}project.beforeEvaluate {} 没有被触发,后来这个配置已经解决了
    【解决方案2】:

    another question 关于使用单独的类路径执行 Java 类时,Peter Niederwieser 提供了 3 种方法。最后将modify my task 扩展为JavaExec。我设置了显式设置执行类路径,它与插件执行类路径分开,可以包含不同的库版本。

    缺点是只允许运行 main 方法,但在我的情况下这不是问题。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      相关资源
      最近更新 更多