You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让sbt离线运行?riscv-torture项目离线部署问题

问题描述

我需要在无互联网访问的服务器上使用riscv-torture项目生成测试用例,尝试了以下方法但均失败:

  1. 本地缓存复制法:在联网的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时仍尝试联网拉取资源失败。
  2. Podman镜像法:基于ubuntu:22.04镜像安装make、openjdk-11-jre,克隆仓库后运行make igentest完成依赖下载和测试生成,构建镜像后在离线机器运行,仍出现依赖缺失并尝试联网拉取的错误。
  3. 手动下载依赖:手动下载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配置与缓存复制

  1. 复制完整缓存目录:将本地以下目录完整复制到离线服务器的对应用户目录(如/home/omer.guzel/):

    • ~/.sbt:SBT配置及插件缓存
    • ~/.ivy2:Ivy依赖缓存
    • ~/.cache/coursier:Coursier缓存(SBT 1.x默认用Coursier解析依赖)
      注意:必须保留所有子目录结构,确保缓存与本地完全一致。
  2. 配置.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依赖解析的核心缓存之一。

  3. 强制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镜像优化方案

若采用容器镜像方式,需在联网构建时完整缓存所有依赖,并在镜像中配置离线参数:

  1. 编写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文件内容与离线环境的配置一致。
  2. 联网构建镜像后,将镜像导入离线服务器运行,确保容器无网络访问权限。

四、依赖缺失排查方法

若仍出现依赖缺失错误:

  • 根据错误中的依赖坐标(如org.scala-lang:scala-library:2.11.12),在本地联网环境的.ivy2/cache或.cache/coursier中找到对应目录,确认所有文件存在后复制到离线服务器的对应路径。
  • 联网环境运行sbt "show update",可列出所有需要的依赖及其路径,对照该列表检查离线环境的缓存完整性。

内容的提问来源于stack exchange,提问作者Ömer GÜZEL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:53:14