SBT native packager提示Universal/mappings未定义设置错误排查
错误原因
Universal / mappings 是sbt-native-packager提供的通用打包映射配置项,该配置项只会在对应打包插件被启用后才会注册到sbt的设置域中。你仅在plugins.sbt中声明了插件依赖,但没有在build.sbt中显式启用Docker打包相关的插件,因此sbt加载项目时找不到该设置项,触发未定义引用错误。
正确配置方式
- 首先在
build.sbt顶部启用所需的sbt-native-packager插件,Docker打包依赖Java应用打包和Docker插件模块:
// 必须添加该配置启用插件,注册相关设置项 enablePlugins(JavaAppPackaging, DockerPlugin)
- 添加自定义文件映射配置,你的单文件映射写法本身逻辑正确,启用插件后即可正常生效:
// 单个文件映射:(本地文件路径, 镜像内目标绝对路径) Universal / mappings += (file("data/housing.tgz"), "/opt/docker/data/housing.tgz")
- (可选)如果需要打包整个自定义目录下的所有文件,不要直接映射目录,需要递归生成文件映射列表:
// 映射项目根目录下整个data文件夹到镜像的/opt/docker/data路径 Universal / mappings ++= { val baseDataDir = file("data") baseDataDir.**(AllPassFilter).get.map { file => val relativePath = baseDataDir.toURI.relativize(file.toURI).getPath (file, s"/opt/docker/data/$relativePath") } }
补充说明
- sbt-native-packager构建的Docker镜像默认工作目录为
/opt/docker,目标路径也可以写相对路径data/housing.tgz,会自动拼接工作目录前缀。 - 请确保你要打包的本地
data目录放在项目根目录(与build.sbt同级),否则会出现文件找不到的错误。 - 配置完成后重新加载sbt项目,执行
Docker/publishLocal即可构建包含自定义文件的本地Docker镜像,可通过启动镜像后执行ls /opt/docker/data验证文件是否存在。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

