使用Gradle构建Jar时GeoLite2数据库损坏问题求助
解决Gradle构建prod包后GeoLite2 City数据库无法读取的问题
问题核心原因
Gradle的processResources任务默认会对资源文件做文本过滤(比如替换占位符),二进制格式的.mmdb文件被过滤后结构会损坏,导致MaxMind无法识别数据库的元数据标记,进而触发InvalidDatabaseException。
正确的Gradle配置
你之前的配置只指定了资源来源,但没禁用过滤,修改build.gradle如下:
processResources { // 对所有.mmdb文件禁用过滤 filesMatching('**/*.mmdb') { filtering.enabled = false } // 若你的mmdb在特定目录,可单独配置该目录下的文件 from('src/main/resources/data') { include '**/*.mmdb' filtering.enabled = false } }
额外检查点
- 资源读取方式:确保代码用
getResourceAsStream读取数据库文件,不要直接用文件路径访问(jar包内资源无法通过File类读取):
InputStream dbStream = getClass().getResourceAsStream("/data/GeoLite2-City.mmdb"); DatabaseReader reader = new DatabaseReader.Builder(dbStream).build();
- 验证构建产物:构建完成后解压jar包,检查
BOOT-INF/classes/data/下的.mmdb文件大小是否和本地原文件一致,也可以用MaxMind官方工具验证文件有效性。
内容的提问来源于stack exchange,提问作者Kiporman
相关产品推荐
相关产品推荐

