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

如何重命名sbt打包后的依赖文件名?移除组与版本信息

问题

从内部仓库引入部分依赖,依赖配置如下:

libraryDependencies ++= Seq(
   ...
   MY_OWN_GROUP % "some_dependency" % MY_OWN_VERSION,
   ...
)

执行sbt dist后,希望lib目录下生成some_dependency.jar,而非带组和版本信息的MY_OWN_GROUP.some_dependency.MY_OWN_VERSION.jar。已查阅sbt、Ivy文档及sbt源码,未找到直接配置方案,寻求解决办法。

可行解决方案

目前没有直接的sbt配置项实现该需求,可从以下三个方向入手:

1. 自定义sbt任务修改dist压缩包内的文件

在build.sbt中添加自定义任务,在sbt dist完成后自动解压生成的压缩包,重命名指定jar文件,再重新打包。示例代码如下:

import sbt._
import java.io.File

val renameDistJars = taskKey[Unit]("Rename specific jars in dist package")

renameDistJars := {
  val distZip = (dist in Universal).value
  val tempDir = target.value / "dist_temp"
  val libDir = tempDir / "lib"
  
  // 解压压缩包到临时目录
  IO.unzip(distZip, tempDir)
  
  // 匹配并重命名目标jar文件
  val targetJarPattern = s"${MY_OWN_GROUP.value}\\..*\\.jar".r
  val jarsToRename = (libDir ** "*.jar").filter { file =>
    targetJarPattern.findFirstIn(file.name).isDefined
  }
  
  jarsToRename.foreach { jar =>
    // 提取artifactId作为新文件名
    val newName = jar.name.split('.').drop(1).dropRight(1).mkString(".") + ".jar"
    IO.rename(jar, libDir / newName)
  }
  
  // 重新打包成新的压缩包
  val newDistZip = target.value / s"${distZip.name.replace(".zip", "_renamed.zip")}"
  IO.zip((tempDir ** "*").pair(relativeTo(tempDir)), newDistZip)
  
  // 替换原dist压缩包(可选操作)
  IO.copyFile(newDistZip, distZip)
  
  // 清理临时目录
  IO.delete(tempDir)
}

// 让dist任务完成后自动执行重命名任务
dist in Universal := (dist in Universal).dependsOn(renameDistJars).value

2. CI流水线中添加重命名步骤

在CI脚本(如GitLab CI、GitHub Actions等)中,在sbt dist执行完成后,添加解压、重命名、重新打包的步骤。以Shell脚本为例:

# 执行sbt dist构建
sbt dist

# 定义变量
DIST_ZIP=$(find target/universal -name "*.zip")
TEMP_DIR="dist_temp"
LIB_DIR="${TEMP_DIR}/lib"
TARGET_GROUP="MY_OWN_GROUP"

# 解压dist压缩包到临时目录
unzip -q "$DIST_ZIP" -d "$TEMP_DIR"

# 遍历并重命名目标jar文件
for jar in "${LIB_DIR}/${TARGET_GROUP}."*.jar; do
  if [ -f "$jar" ]; then
    # 提取artifactId生成新文件名
    new_name=$(echo "$jar" | sed -E "s/${TARGET_GROUP}\.(.*)\.[0-9]+\..*\.jar/\1.jar/")
    mv "$jar" "$new_name"
  fi
done

# 重新打包成压缩包
zip -r -q "${DIST_ZIP%.zip}_renamed.zip" "$TEMP_DIR"

# 替换原dist压缩包(可选操作)
mv "${DIST_ZIP%.zip}_renamed.zip" "$DIST_ZIP"

# 清理临时目录
rm -rf "$TEMP_DIR"

3. 标记依赖为provided,在CI中手动复制jar到lib目录

  1. 修改依赖配置,将目标依赖标记为provided,避免sbt dist自动打包该依赖:
libraryDependencies ++= Seq(
   ...
   MY_OWN_GROUP % "some_dependency" % MY_OWN_VERSION % Provided,
   ...
)
  1. 在CI流水线中,从内部仓库拉取该依赖的jar文件,复制到dist压缩包的lib目录中:
# 执行sbt dist构建
sbt dist

# 从内部仓库拉取目标jar(根据内部仓库实际方式调整命令)
curl -O "http://internal-repo-url/${MY_OWN_GROUP}/some_dependency/${MY_OWN_VERSION}/some_dependency.jar"

# 定义变量
DIST_ZIP=$(find target/universal -name "*.zip")
TEMP_DIR="dist_temp"

# 解压dist压缩包
unzip -q "$DIST_ZIP" -d "$TEMP_DIR"

# 复制jar到lib目录
cp some_dependency.jar "${TEMP_DIR}/lib/"

# 重新打包压缩包
zip -r -q "$DIST_ZIP" "$TEMP_DIR"

# 清理临时文件
rm -rf "$TEMP_DIR" some_dependency.jar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:17:28