如何使用Gradle在JVM项目的Release版本中排除依赖?
JVM项目中仅保留调试类库在Debug版本的方案
在JVM项目(纯Java/Kotlin)中,虽然不像Android项目那样默认提供debugImplementation这类配置,但可以通过Gradle自定义配置和构建变体来实现相同效果,核心思路是区分Debug和Release的依赖集与编译输出。
方法一:自定义Debug/Release专属依赖配置(推荐)
通过Gradle的配置扩展,手动创建对应构建类型的依赖配置,并关联到对应的源码集:
Groovy DSL(build.gradle)
plugins { id 'java' } // 定义Debug和Release专属配置,继承自通用的implementation configurations { debugImplementation.extendsFrom implementation releaseImplementation.extendsFrom implementation } dependencies { // 仅Debug版本引入调试类库 debugImplementation 'com.your.debug:library:1.0.0' // 通用业务依赖仍用implementation implementation 'com.your.common:library:2.0.0' } sourceSets { debug { // 关联Debug源码目录(可选,若有Debug专属代码) java.srcDir 'src/debug/java' resources.srcDir 'src/debug/resources' // 让Debug编译时包含debugImplementation的依赖 compileClasspath += configurations.debugImplementation runtimeClasspath += configurations.debugImplementation } release { java.srcDir 'src/release/java' resources.srcDir 'src/release/resources' // Release编译排除Debug依赖 compileClasspath += configurations.releaseImplementation runtimeClasspath += configurations.releaseImplementation compileClasspath -= configurations.debugImplementation } } // 配置Jar任务,默认打包Release版本的输出 tasks.jar { from sourceSets.release.output } // 可选:创建Debug专属的Jar任务 task debugJar(type: Jar) { from sourceSets.debug.output archiveClassifier = 'debug' }
Kotlin DSL(build.gradle.kts)
plugins { java } // 自定义Debug和Release配置 val debugImplementation by configurations.creating { extendsFrom(configurations.implementation.get()) } val releaseImplementation by configurations.creating { extendsFrom(configurations.implementation.get()) } dependencies { debugImplementation("com.your.debug:library:1.0.0") implementation("com.your.common:library:2.0.0") } sourceSets { create("debug") { java.srcDir("src/debug/java") resources.srcDir("src/debug/resources") compileClasspath += debugImplementation runtimeClasspath += debugImplementation } create("release") { java.srcDir("src/release/java") resources.srcDir("src/release/resources") compileClasspath += releaseImplementation runtimeClasspath += releaseImplementation compileClasspath -= debugImplementation } } tasks.named<Jar>("jar") { from(sourceSets["release"].output) } // 可选:Debug专属Jar任务 tasks.register<Jar>("debugJar") { from(sourceSets["debug"].output) archiveClassifier.set("debug") }
方法二:通过项目属性动态控制依赖
如果不需要复杂的构建变体,也可以通过Gradle项目属性来动态判断是否引入调试类库:
Groovy DSL
dependencies { // 当构建时传入-Pdebug参数,才引入调试类库 if (project.hasProperty("debug")) { implementation 'com.your.debug:library:1.0.0' } implementation 'com.your.common:library:2.0.0' }
构建Debug版本时执行:
./gradlew build -Pdebug
普通构建(Release)直接执行./gradlew build即可,不会包含调试类库。
注意点
- 若有Debug专属的业务代码,建议放在
src/debug/java目录下,避免Release编译时出现未引用的调试类错误。 - 自定义配置时需确保
releaseImplementation不包含任何调试相关依赖,避免产物冗余。
内容的提问来源于stack exchange,提问作者AmirHossein Abdolmotallebi
相关产品推荐
相关产品推荐

