Gradle Kotlin DSL 分离构建Jar与依赖Jar 适配分发任务调整类路径配置
跨分发任务生效的Gradle Application自定义目录结构实现方案
核心原理
Application插件下的installDist、distZip、distTar三类分发任务,全部读取同一份公共分发内容源生成产物。此前尝试修改applicationDistribution的包含/排除规则不生效,通常是因为只做了排除操作,没有重新定义不同文件的目标路径,默认的路径映射规则依然会把项目Jar丢到lib目录下。之前单独修改installDist任务无法同步影响其他任务,原因是只给单个任务加了执行完删文件、拷文件的后置钩子,没有从公共源层面调整文件的路径映射,所以其他任务还是会沿用默认规则——把项目构建Jar和全部依赖Jar统一丢进lib目录,结构自然对不上。
具体实现(Kotlin DSL)
1. 调整公共分发内容的路径映射
从源层面区分不同文件的存放路径,让所有分发任务自动应用这套规则:
// 关联Java插件产出的项目自身Jar任务 val jarTask = tasks.jar // 关联启动脚本任务 val startScriptsTask = tasks.startScripts applicationDistribution { contents { // 项目自身构建的Jar直接放到分发产物根目录 from(jarTask) { into(".") } // 启动脚本从默认的bin目录调整到分发根目录 from(startScriptsTask.outputDir) { into(".") } // 第三方依赖Jar统一保留在lib目录,排除项目自身Jar避免重复复制 from(configurations.runtimeClasspath.get()) { into("lib") exclude(jarTask.archiveFile) } } }
2. 同步修正启动脚本的类路径配置
默认启动脚本基于「所有Jar都在lib目录」的规则生成类路径,需要手动调整为匹配新的文件结构:
tasks.startScripts { // 将根目录下的项目自身Jar加入类路径 classpath += files(jarTask.archiveFile) // 移除类路径中重复指向lib目录下项目Jar的条目 classpath = classpath.filter { it.absolutePath != jarTask.archiveFile.get().asFile.absolutePath } }
最终产物结构
配置生效后,所有分发任务生成的目录结构和预期完全匹配:
myProgram/ ├── lib/ │ ├── lib1.jar │ ├── lib2.jar │ └── ...(全部第三方依赖Jar) ├── myProgram(shell启动脚本) ├── myProgram.bat(Windows批处理脚本) └── myBuilt.jar(项目自身构建的Jar)
这套配置的优势:
- 不需要给每个分发任务单独加后置处理逻辑,所有规则直接作用在公共分发源上
installDist生成的本地安装目录结构正确distZip、distTar打包的压缩包内结构保持一致- 启动脚本的类路径自动匹配新的文件位置,不需要手动硬编码Jar路径
内容的提问来源于stack exchange,提问作者JumbleGee
相关产品推荐
相关产品推荐

