1. 引言在 Java 项目中,SQLite 因其轻量、无需独立服务端的特点,常被用作本地数据存储方案。然而,当我们需要将应用打包成可执行的 Jar 包分发时,数据库文件如何处理就成了一个常见问题:是随包携带一个预置的数据库文件,还是让程序在首次运行时自动创建?本文将围绕「Java 将 SQLite 数据库打包到 Jar 包中」这一主题,介绍两种主流方案,并给出可直接运行的代码示例,帮助你解决打包与运行时数据库文件读取、写入的痛点。2. 核心问题:Jar 包内的文件无法直接写入在动手之前,先理解一个关键限制:Jar 包内的资源是只读的。当我们把 SQLite 数据库文件(.db或.sqlite)作为资源放进 Jar 包后,程序可以通过getResourceAsStream()读取它,但无法直接对它进行写入操作。SQLite 的读写需要基于文件系统路径,而 Jar 包内的文件并不存在于真实的文件系统路径中。因此,打包 SQLite 数据库的核心思路是:方案一:将预置数据库作为资源打包,首次运行时复制到用户目录或临时目录,之后读写该副本。方案二:不打包数据库文件,而是在首次运行时通过代码创建数据库和表结构。下面分别介绍这两种方案。3. 方案一:打包预置数据库,运行时复制到外部这是最常用的方案,适用于需要随应用分发一份「初始数据」的场景(例如内置词典、默认配置数据)。3.1 目录结构src/main/resources/ └── db/ └── app.db # 预置的 SQLite 数据库文件3.2 首次运行时复制数据库importjava.io.InputStream;importjava.io.OutputStream;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;publicclassDatabaseInitializer{/** 数据库在 Jar 包内的资源路径 */privatestaticfinalStringRESOURCE_DB_PATH="/db/app.db";/** 数据库在外部文件系统的存放位置(用户主目录下) */privatestaticfinalStringEXTERNAL_DB_DIR=System.getProperty("user.home")+"/.myapp";publicstaticPathgetOrCreateDatabase()throwsException{Pathdir=Paths.get(EXTERNAL_DB_DIR);if(!Files.exists(dir)){Files.createDirectories(dir);}PathdbFile=dir.resolve("app.db");// 如果外部文件已存在,直接返回(避免覆盖用户数据)if(Files.exists(dbFile)){