运行Gradle生成的Jar包时如何让Apache Derby数据库正常工作
该需求完全可实现,以下是两种符合要求的低复杂度解决方案:
方案一:构建单文件可执行胖Jar(最推荐)
该方案会将Derby驱动、JavaFX相关依赖等所有运行所需资源全部打包到同一个Jar文件中,部署仅需传递单个文件,用户无需额外操作即可直接运行。
配置步骤
- 在
build.gradle中引入shadow打包插件,添加依赖配置:
plugins { // 保留你已有的插件,比如java、application、javafx等 id 'com.github.johnrengelman.shadow' version '7.1.2' } dependencies { // 保留已有的JavaFX等其他依赖 // 添加嵌入式Derby核心依赖 implementation 'org.apache.derby:derby:10.15.2.0' }
- 配置shadowJar打包参数:
shadowJar { mergeServiceFiles() // 必加,处理JDBC驱动的SPI注册配置,避免驱动加载失败 manifest { attributes 'Main-Class': '替换为你自己的主类全限定名,例如com.xxx.MyApplication' } } // 可选配置:执行build命令时自动生成胖Jar build.dependsOn shadowJar
- 执行构建命令:
Linux/macOS执行:./gradlew build
Windows执行:gradlew.bat build
构建完成后,build/libs目录下后缀带-all的Jar文件就是最终可部署文件,拷贝到任意安装了兼容版本JRE的设备上,直接运行即可。
方案二:主Jar与依赖分离部署(符合指定文件夹存放要求)
如果不需要单文件部署,可将所有依赖Jar统一放到lib文件夹下,和主Jar同目录即可,部署时只需将主Jar和lib文件夹一同传递给用户。
配置步骤
在build.gradle中添加如下配置:
// 自动将所有运行时依赖复制到build/libs/lib目录 task copyRuntimeLibs(type: Copy) { from configurations.runtimeClasspath into "${buildDir}/libs/lib" } jar { manifest { attributes( 'Main-Class': '替换为你自己的主类全限定名', 'Class-Path': configurations.runtimeClasspath.files.collect { "lib/${it.name}" }.join(' ') ) } dependsOn copyRuntimeLibs }
执行构建命令后,build/libs目录下会生成主Jar文件和lib文件夹,部署时将二者放在同一目录下,用户直接运行主Jar即可,无需手动配置类路径。
常见注意事项
- 若打包后仍提示驱动类找不到,优先检查Derby依赖是否正确添加,以及胖Jar配置中是否遗漏了
mergeServiceFiles()配置项,JDBC4及以上版本的驱动依赖SPI服务注册,缺省该配置会导致驱动类存在但无法被识别 - 部署到其他设备时,确保目标设备安装的JRE版本与编译使用的JDK版本兼容,Derby 10.15及以上版本需要JDK11及以上运行环境支持
内容的提问来源于stack exchange,提问作者Jacob Bernard
相关产品推荐
相关产品推荐

