You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Compose Multiplatform打包MSI后出现的java/sql/DriverManager错误

解决Compose Multiplatform打包MSI后找不到java.sql.DriverManager的问题

问题原因

IDE运行应用时依赖完整JDK环境,默认包含java.sql模块;但打包成MSI安装包时,Compose Multiplatform的默认配置未将该模块纳入分发包,导致运行时无法找到java.sql.DriverManager类。

解决方案

1. 在打包配置中添加JVM模块参数

修改桌面模块的build.gradle.kts,在compose.desktop.application或nativeDistributions中添加--add-modules=java.sql参数,确保打包时包含所需模块:

compose.desktop {
    application {
        mainClass = "你的主类路径,比如com.example.MainKt"
        
        // 添加JVM参数引入java.sql模块
        jvmArgs += "--add-modules=java.sql"
        // 若JDBC驱动需要额外模块(如java.naming),可一并添加
        // jvmArgs += "--add-modules=java.sql,java.naming"

        nativeDistributions {
            targetFormats(TargetFormat.MSI)
            // 其他打包配置(如应用名称、版本等)
        }
    }
}

或者直接在nativeDistributions中配置:

nativeDistributions {
    targetFormats(TargetFormat.MSI)
    jvmArgs.add("--add-modules=java.sql")
}

2. 确认PostgreSQL驱动依赖配置

确保PostgreSQL驱动依赖使用implementation(而非compileOnly),保证驱动被打包进安装包:

dependencies {
    implementation("org.postgresql:postgresql:42.7.3") // 使用最新稳定版本
    // 其他依赖...
}

3. 优化数据库连接代码(可选但推荐)

不要在Composable函数中直接初始化数据库连接,Composable重组会导致重复创建连接,建议将连接逻辑放到ViewModel中管理:

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import java.sql.Connection
import java.sql.DriverManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch

class DbViewModel : ViewModel() {
    private val _connectionValid = MutableStateFlow(false)
    val connectionValid: StateFlow<Boolean> = _connectionValid

    init {
        viewModelScope.launch(Dispatchers.IO) {
            runCatching {
                DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/your_database",
                    "postgres",
                    "12345"
                ).use { connection ->
                    _connectionValid.value = connection.isValid(1000)
                }
            }.onFailure {
                _connectionValid.value = false
            }
        }
    }
}

@Composable
fun App() {
    MaterialTheme {
        val viewModel = viewModel<DbViewModel>()
        val isValid by viewModel.connectionValid.collectAsState()
        Text(text = "数据库连接状态:${if (isValid) "有效" else "无效"}")
    }
}

内容的提问来源于stack exchange,提问作者za ko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:35:54