在我的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)
替换一个衬里和反射调用。
也许有一种更简单的方法可以通过插件来修改类路径,并使用该插件调用上述方法?
主要问题。允许插件用户定义插件执行的库版本的最佳方法是什么?
答案 0 :(得分:0)
我不确定这是你在寻找什么,但是Jacoco插件允许用户配置正在使用的库。
class JacocoPluginExtension {
// ...
String toolVersion = '0.32.0'
// ...
}
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方法,但在我的情况下它不是问题。