Gradle自定义插件运行时找不到jar包内resources下coco.gradle文件
问题根源
你使用new File("相对路径")读取文件时,默认读取的是运行Gradle命令的业务项目的工作目录下的文件,无法读取到插件jar包内的resources资源,需要通过类加载器读取插件classpath下的资源。
解决方案1:保留coco.gradle资源文件的写法
修改插件代码为如下逻辑,通过类加载器读取jar内的配置文件并应用:
package com.jink.test import org.gradle.api.Plugin import org.gradle.api.Project class FileDiffPlugin implements Plugin<Project> { @Override void apply(Project project) { // 从插件jar的类路径加载coco.gradle URL configResource = this.class.getClassLoader().getResource("coco.gradle") if (configResource == null) { throw new RuntimeException("插件jar内缺失coco.gradle配置文件") } // 应用读取到的配置脚本 project.apply from: configResource project.tasks.create('javaCoco') { doLast { println "Hello World" } } } }
注意:你提供的coco.gradle存在语法错误,reports块的配置需要修正为:
apply plugin: "jacoco" allprojects { jacoco { toolVersion = "0.8.2" } test { jacoco { destinationFile = file("$buildDir/../target/jacoco.exec") } } jacocotestReport { reports{ xml.enabled true html.enabled true } } }
解决方案2:无配置文件方案(更推荐)
直接把Jacoco的配置逻辑写进插件代码,不需要单独维护coco.gradle资源文件,封装性更好:
package com.jink.test import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.testing.jacoco.tasks.JacocoReport import org.gradle.api.tasks.testing.Test class FileDiffPlugin implements Plugin<Project> { @Override void apply(Project project) { // 自动应用Jacoco插件 project.pluginManager.apply("jacoco") // 全局配置所有子项目的Jacoco参数 project.allprojects { currentProj -> currentProj.jacoco { toolVersion = "0.8.2" } // 配置测试任务的Jacoco输出路径 currentProj.tasks.withType(Test) { testTask -> testTask.jacoco { destinationFile = currentProj.file("${currentProj.buildDir}/../target/jacoco.exec") } } // 配置Jacoco报告生成规则 currentProj.tasks.withType(JacocoReport) { reportTask -> reportTask.reports { xml.enabled = true html.enabled = true } } } project.tasks.create('javaCoco') { doLast { println "Hello World,Jacoco配置已自动注入" } } } }
修改后重新发布插件到本地Maven,业务项目引入后即可直接使用所有Jacoco能力,无需额外配置。
内容的提问来源于stack exchange,提问作者krishna chaitanya jinka
相关产品推荐
相关产品推荐

