依赖编译运行类路径生成Jar资源时的Gradle任务循环如何解决?
问题根因
你遇到的循环依赖本质是依赖链闭环:
- 你将
compileAllReports加入主源集的资源目录,Gradle自动生成processResources→compileAllReports的依赖 - 你给
compileAllReports添加了sourceSets.main.runtimeClasspath作为类路径,而runtimeClasspath包含了项目主源集的全部输出(编译类+处理后资源),因此Gradle自动生成compileAllReports→classes的依赖 - 原生Gradle Java插件的依赖链是
classes→processResources,三者形成闭环
最优解决方案
调整compileAllReports的类路径配置,拆分依赖项避开对classes任务的依赖即可:
apply plugin: 'com.github.gmazelier.jasperreports' compileAllReports { // 加入所有三方依赖(包含compile和runtime scope的依赖包) addClasspath(project.configurations.runtimeClasspath) // 仅加入Java编译后的类目录,仅依赖compileJava任务,不依赖processResources addClasspath(project.files(project.sourceSets.main.java.outputDir)) } // 原有资源目录配置保留,自动将生成的报表打入Jar包 sourceSets.main.resources.srcDir compileAllReports
调整后依赖链变为:classes → processResources → compileAllReports → compileJava
完全消除循环。
相关疑问解答
- 为什么仅依赖
compileJava足够?
编译JasperReports模板只需要用到类定义和三方依赖,不需要处理后的项目资源。compileJava执行完成后,项目自身的类文件已经生成,加上runtimeClasspath里的所有三方依赖,完全满足编译需求。 - 什么情况需要额外调整?
如果你的JasperReports模板编译过程需要用到项目内的原始资源文件,可以额外添加原始资源目录到类路径,不会引入额外依赖:
compileAllReports { addClasspath(project.files(project.sourceSets.main.resources.srcDirs)) }
内容的提问来源于stack exchange,提问作者Florian Cramer
相关产品推荐
相关产品推荐

