1

在我的插件中,我从一个库中调用静态引导方法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)使用新的类加载器用反射调用替换一个衬里。

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

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

4

2 回答 2

0

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

JacocoPluginExtension

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

Jacoco 插件

class JacocoPlugin implements Plugin<Project> {
    // ...
    config.dependencies.add(this.project.dependencies.create("org.jacoco:org.jacoco.ant:${extension.toolVersion}"))
    // ...
}
于 2014-03-23T15:27:43.017 回答
0

另一个关于使用单独的类路径执行 Java 类的问题中,Peter Niederwieser 提供了 3 种方法。最后修改我的任务以扩展JavaExec. 我设置了显式设置执行类路径,它与插件执行类路径分开,可以包含不同的库版本。

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

于 2015-03-22T13:59:03.793 回答