如何重命名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目录
- 修改依赖配置,将目标依赖标记为
provided,避免sbt dist自动打包该依赖:
libraryDependencies ++= Seq( ... MY_OWN_GROUP % "some_dependency" % MY_OWN_VERSION % Provided, ... )
- 在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
相关产品推荐
相关产品推荐

