如何允许用户更改Gradle中插件使用的库版本?

时间:2014-03-22 23:09:20

标签: java gradle classpath gradle-custom-plugin

在我的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.我可能需要从我的插件(原始库版本及其依赖项)中删除传递依赖项,并在请求的版本中添加库(从配置闭包中)作为buildscript依赖项。

在afterEvaluate之后它会延迟(配置已解决)并且我有成功与beforeEvaluate挂钩的问题(是否为单个模块项目触发?)。

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

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

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

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

2 个答案:

答案 0 :(得分:0)

我不确定这是你在寻找什么,但是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}"))
    // ...
}

答案 1 :(得分:0)

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

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