如何分发Kotlin CLI应用?使用application插件installDist后运行无输出怎么办
问题排查方案
1. 优先排查日志配置缺失问题
- 你在开发环境(IDE/
./gradlew run)运行时,src/main/resources下的logback.xml等配置文件会自动加入类路径,但若配置文件放在src/test/resources,或者gradle配置排除了资源文件打包,打包后的运行环境就会缺失日志配置 - logback默认无配置时仅输出
ERROR级别日志,若你的业务日志、异常堆栈都是INFO/DEBUG级别,就会出现无任何输出直接退出的假象 - 排查方式:运行启动脚本时添加日志调试参数,确认配置加载状态:
installationDir/bin/App -Dlogback.debug=true - 修复方案:将日志配置文件移到
src/main/resources目录下,确保打包时被打入jar包。
2. 检查主函数的阻塞逻辑是否缺失
- 机器人程序通常是常驻进程,如果你使用协程实现异步逻辑,很容易出现主函数执行完成直接退出的问题:
- 如果你用
GlobalScope.launch启动机器人逻辑,这类协程属于守护线程,主线程退出时会被直接销毁 - 如果你在
runBlocking中启动子协程但没有调用join()等阻塞方法,也会导致逻辑未执行完成就提前退出
- 如果你用
- 为什么
./gradlew run能正常运行?部分IDE/gradle运行配置会默认加守护参数,或者你开发时加了调试断点阻止了主线程退出,和打包后的运行环境不一致。 - 修复方案:确保主函数阻塞到机器人进程终止,示例写法:
fun main() = runBlocking { val robotJob = launch { // 你的机器人运行逻辑 } robotJob.join() // 阻塞等待协程执行完成 }
3. 检查打包后的资源是否完整
- 解压
build/libs下生成的jar包,确认日志配置文件、业务依赖的其他资源文件是否被正常打包进去 - 同时可以在主函数最开头加入
println("程序启动")这类标准输出,运行打包后的脚本确认是否有输出,排除主类配置错误问题。
内容的提问来源于stack exchange,提问作者Some random IT boy
相关产品推荐
相关产品推荐

