如何从Scala 3项目构建无需安装Scala的EXE或胖JAR?
Scala 3 构建独立可执行二进制文件方案
需求说明
- 构建可在仅安装Java的机器上运行的程序,目标机器无需安装Scala(由开发端控制Scala版本)
- 无需制作安装程序,支持频繁更新替换文件
- 项目主文件路径:
/src/main/scala/main.scala,代码如下:
@main def main(): Unit =
当前build.sbt配置:
ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "3.3.1" lazy val root = (project in file(".")) .settings( name := "foo", libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.2.0", libraryDependencies += "org.scala-lang.modules" %% "scala-xml" % "2.1.0", libraryDependencies += "com.lihaoyi" %% "os-lib" % "0.9.1", libraryDependencies += "com.lihaoyi" %% "requests" % "0.8.0", libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % Test, ) scalacOptions ++= Seq("-deprecation", "-feature")
实现方案:使用sbt-assembly打包Fat Jar
最简便的方式是用sbt-assembly插件,它会将你的代码、所有依赖(包括Scala标准库)打包成一个独立的Jar文件(Fat Jar),只需Java环境即可运行,完全满足你的需求。
步骤1:添加sbt-assembly插件
在项目根目录下创建project/plugins.sbt文件,添加以下内容:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.1")
步骤2:配置build.sbt
在root项目的settings中添加assembly相关配置,处理重复文件冲突并适配Scala 3的主类生成规则:
lazy val root = (project in file(".")) .settings( // 原有配置保持不变 name := "foo", libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.2.0", libraryDependencies += "org.scala-lang.modules" %% "scala-xml" % "2.1.0", libraryDependencies += "com.lihaoyi" %% "os-lib" % "0.9.1", libraryDependencies += "com.lihaoyi" %% "requests" % "0.8.0", libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % Test, // 添加assembly配置 assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }, // Scala 3的@main会自动生成主类,插件可自动检测,若需手动指定可取消下面注释 // mainClass in assembly := Some("main") )
步骤3:执行打包命令
在项目根目录运行:
sbt assembly
打包完成后,独立Jar文件会生成在target/scala-3.3.1/foo-assembly-0.1.0-SNAPSHOT.jar(名称根据你的项目名和版本自动调整)。
步骤4:运行程序
在目标机器上,只需执行以下命令即可运行(确保已安装Java):
java -jar foo-assembly-0.1.0-SNAPSHOT.jar
方案优势
- 目标机器无需安装Scala,所有依赖(包括Scala核心库)都封装在Jar中
- 更新时仅需替换Jar文件,无需安装程序,适配频繁更新场景
- 配置和操作流程简单,符合快速迭代需求
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

