Java 8迁移至11后Jenkins中Flapdoodle Embedded Mongo运行失败求助
问题分析与解决方案
从错误日志来看,核心问题是Flapdoodle下载了Ubuntu 20.04版本的MongoDB二进制包,但你的Jenkins Linux服务器系统(大概率是CentOS/RHEL等旧版本发行版,或glibc版本过低)与该包不兼容,导致启动mongod时出现依赖库缺失、符号找不到等错误。
解决方案
1. 检查服务器系统与glibc版本
先确认Jenkins服务器的系统信息和glibc版本:
# 查看系统发行版 cat /etc/os-release # 查看glibc版本 ldd --version
Ubuntu 20.04要求glibc 2.28及以上,如果你的服务器glibc版本低于这个值,就会出现__snprintf_chk、__memcpy_chk等符号找不到的问题。
2. 强制指定兼容的MongoDB版本或系统包
修改Flapdoodle配置,指定一个与服务器系统兼容的MongoDB版本(比如4.0.x系列,对glibc要求更低),或者直接指定对应发行版的包:
示例1:指定低版本MongoDB
import de.flapdoodle.embed.mongo.config.MongodConfig; import de.flapdoodle.embed.mongo.distribution.Version; import de.flapdoodle.embed.process.runtime.Network; // 在测试类的配置中设置 MongodConfig mongodConfig = MongodConfig.builder() .version(Version.V4_0_27) // 选择兼容旧glibc的MongoDB版本 .net(new Net("localhost", Network.freeServerPort(), false)) .build();
示例2:指定对应发行版的包(比如CentOS 7)
import de.flapdoodle.embed.mongo.packageresolver.Command; import de.flapdoodle.embed.mongo.packageresolver.PackageResolver; import de.flapdoodle.embed.mongo.packageresolver.linux.LinuxPlatform; import de.flapdoodle.embed.process.distribution.Architecture; import de.flapdoodle.embed.process.distribution.OperatingSystem; import de.flapdoodle.embed.mongo.distribution.Version; PackageResolver customResolver = PackageResolver.builder() .forCommand(Command.MongoD) .put( LinuxPlatform.builder() .operatingSystem(OperatingSystem.Linux) .architecture(Architecture.X86_64) .version("CentOS_7") .build(), Version.V4_4_17, "mongodb-linux-x86_64-rhel70-4.4.17.tgz" ) .build(); // 将customResolver配置到Flapdoodle的MongoDB工厂中
3. 安装缺失的系统依赖库
如果服务器缺少libresolv.so.2等基础库,执行对应系统的安装命令:
- Debian/Ubuntu系统:
apt-get update && apt-get install -y libc6
- CentOS/RHEL系统:
yum install -y glibc
如果Jenkins运行在Docker容器中,需要修改Dockerfile,在构建阶段添加上述安装命令。
4. 清理Flapdoodle缓存
删除Jenkins服务器上的Flapdoodle缓存目录,让它重新下载兼容的包:
rm -rf /root/.embedmongo/linux
内容的提问来源于stack exchange,提问作者Pranay Jaiswal
相关产品推荐
相关产品推荐

