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

Sbt Publish在GitLab CI/CD中生成HTML而非Class文件问题

问题解决思路

核心原因推测

GitLab CI的publish任务是独立的容器环境,和package任务完全隔离,默认执行sbt publish时可能因为环境差异(比如sbt缓存、插件行为)没有正确触发代码编译,导致最终打包的Jar只包含了生成的HTML文件。

具体修复步骤

1. 强制publish任务先完成完整编译

修改.gitlab-ci.yml的publish脚本,明确指定编译+发布的流程,避免sbt在CI环境中跳过编译:

publish:
  stage: publish
  image: scala-sbt:8u312_1.5.5_2.12.15
  script:
    - sbt clean compile publish  # 先清理、编译,再发布
  rules:
    - when: manual

2. 对齐本地与CI的sbt/Scala版本

确认你本地使用的sbt版本、Scala版本和CI镜像scala-sbt:8u312_1.5.5_2.12.15完全匹配:

  • 本地执行sbt sbtVersion和scalaVersion,对比CI镜像的版本(sbt 1.5.5、Scala 2.12.15)
  • 如果版本不一致,要么升级本地版本,要么更换CI镜像到和本地匹配的版本

3. 排查publish任务的日志细节

手动触发publish任务后,查看完整日志:

  • 确认是否有compile阶段的输出,比如[info] Compiling X Scala sources to ...
  • 查看打包阶段的日志,确认Jar文件包含的内容,比如[info] Packaging .../target/scala-2.12/liblib_2.12-1.0.jar之后的输出,是否有提示包含class文件

4. 确保credentials正确加载(可选)

虽然Jar能生成,但还是要确认CI环境中凭证配置正常:

  • 在GitLab CI的变量中添加SBT_CREDENTIALS变量,内容为本地.sbt/.credentials的文本
  • 修改build.sbt,从环境变量加载凭证,避免依赖容器内的文件:
credentials += Credentials(new StringReader(sys.env("SBT_CREDENTIALS")))

同时在.gitlab-ci.yml的publish任务中注入变量:

publish:
  stage: publish
  image: scala-sbt:8u312_1.5.5_2.12.15
  variables:
    SBT_CREDENTIALS: "$SBT_CREDENTIALS"  # 从GitLab变量中读取
  script:
    - sbt clean compile publish
  rules:
    - when: manual

验证方法

修改后触发publish任务,下载Nexus上的Jar包,用jar tf liblib_2.12-1.0.jar命令查看内容,确认包含com/example/开头的class文件,而非只有HTML。

内容的提问来源于stack exchange,提问作者Rida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:20:42