如何让sbt离线运行?riscv-torture项目离线部署问题
问题描述
我需要在无互联网访问的服务器上使用riscv-torture项目生成测试用例,尝试了以下方法但均失败:
- 本地缓存复制法:在联网的Ubuntu 22.04环境运行项目后,将
.sbt、.ivy2、.cache/coursier、.cache/JPN文件夹复制到目标离线服务器,添加.sbt/repositories配置文件:
同时在[repositories] local cache: file:///home/omer.guzel/.ivy2/cache, [organisation]/[module]/ivy-[revision].xml, [organisation]/[module]/[type]s/[module]-[revision].[type]build.sbt开头添加offline := true配置,但运行make igentest时仍尝试联网拉取资源失败。 - Podman镜像法:基于
ubuntu:22.04镜像安装make、openjdk-11-jre,克隆仓库后运行make igentest完成依赖下载和测试生成,构建镜像后在离线机器运行,仍出现依赖缺失并尝试联网拉取的错误。 - 手动下载依赖:手动下载
compiler-bridge_2.11-1.8.0.jar和.pom文件到对应目录,却又出现新错误:[warn] Note: Unresolved dependencies path: [error] sbt.librarymanagement.ResolveException: Error downloading org.scala-lang:scala-library:2.11.12
正确的SBT离线运行解决方案
一、确保本地完全缓存所有依赖(关键前提)
在联网环境中,必须让SBT完整拉取所有依赖及传递性依赖,不能仅跑一次make igentest就停止:
- 进入本地riscv-torture项目目录,运行
sbt clean compile test,强制SBT拉取编译、测试所需的全部依赖(包括scala-library这类基础依赖)。 - 检查
.ivy2/cache/org.scala-lang/scala-library/2.11.12目录下是否存在.jar、.pom、.ivy.xml等完整文件,若缺失则运行sbt "update"触发重新拉取。
二、离线环境SBT配置与缓存复制
复制完整缓存目录:将本地以下目录完整复制到离线服务器的对应用户目录(如
/home/omer.guzel/):~/.sbt:SBT配置及插件缓存~/.ivy2:Ivy依赖缓存~/.cache/coursier:Coursier缓存(SBT 1.x默认用Coursier解析依赖)
注意:必须保留所有子目录结构,确保缓存与本地完全一致。
配置
.sbt/repositories文件:
离线环境仅保留本地与缓存仓库,禁用所有远程源,配置内容如下(替换为离线服务器实际用户路径):[repositories] local ivy-cache: file:///home/omer.guzel/.ivy2/cache coursier-cache: file:///home/omer.guzel/.cache/coursier/v1说明:之前的配置遗漏了Coursier缓存源,这是SBT 1.x依赖解析的核心缓存之一。
强制SBT进入离线模式:
- 项目层面:在
build.sbt开头添加:offline := true updateOptions := updateOptions.value.withCachedResolution(true) - 命令层面:无需修改项目文件,运行时直接加参数:
make igentest SBT_OPTS="-Dsbt.offline=true" - 环境变量设置:
export SBT_BOOT_DIR=/home/omer.guzel/.sbt/boot,让SBT使用本地已有的boot目录,避免尝试更新自身。
- 项目层面:在
三、Podman镜像优化方案
若采用容器镜像方式,需在联网构建时完整缓存所有依赖,并在镜像中配置离线参数:
- 编写Dockerfile:
其中FROM ubuntu:22.04 RUN apt-get update && apt-get install -y make openjdk-11-jre git RUN mkdir -p /root/.sbt COPY repositories /root/.sbt/repositories ENV SBT_OPTS="-Dsbt.offline=true" ENV SBT_BOOT_DIR=/root/.sbt/boot RUN git clone https://github.com/riscv-software-src/riscv-torture.git /riscv-torture WORKDIR /riscv-torture RUN sbt clean compile test update CMD ["make", "igentest"]repositories文件内容与离线环境的配置一致。 - 联网构建镜像后,将镜像导入离线服务器运行,确保容器无网络访问权限。
四、依赖缺失排查方法
若仍出现依赖缺失错误:
- 根据错误中的依赖坐标(如
org.scala-lang:scala-library:2.11.12),在本地联网环境的.ivy2/cache或.cache/coursier中找到对应目录,确认所有文件存在后复制到离线服务器的对应路径。 - 联网环境运行
sbt "show update",可列出所有需要的依赖及其路径,对照该列表检查离线环境的缓存完整性。
内容的提问来源于stack exchange,提问作者Ömer GÜZEL
相关产品推荐
相关产品推荐

