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

标签 java gradle classpath gradle-custom-plugin

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

我可以建议用户从我的插件中排除传递依赖项,并手动将请求版本中的库的依赖项添加到他的 build.gradle 中的 buildscript.dependency.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 Hook 时遇到问题(是否为单个模块项目触发?)。

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

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

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

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

最佳答案

我不确定这就是您正在寻找的内容,但 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}"))
    // ...
}

关于java - 如何允许用户更改 Gradle 中插件使用的库的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22584869/

相关文章:

java - 无法解析对值 :$akka. 的替换 stream-blocking io dispatcher

java - 从货币代码中检索货币符号

android - 无法使用最新的gradle版本制作android项目

eclipse - 相当于Intellij IDEA中的Eclipse Classpath容器

javac -classpath 没有做到这一点

Java : loop on all the classes in the classpath

java - 复杂搜索查询 JPA

java - 为什么我的片段着色器中的纹理坐标始终为 (0, 0)?

android - 使用两个项目的ClassNotFoundException

java - Gradle 依赖项不包含在 jar 中