如何解决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
相关产品推荐
相关产品推荐

