如何无需修改sbt.build,执行sbt assembly时传递mainClass参数?
如何在sbt assembly时动态指定mainClass而不修改build文件?
当然可以做到!完全不用每次修改build.sbt文件就能动态指定主类来执行assembly,给你两种实用的方法:
方法一:命令行临时指定参数
这是最直接的方式,你可以在调用sbt时临时设置assembly任务的mainClass参数,不用改动任何配置文件。正确的命令格式是:
sbt 'set mainClass in assembly := Some("com.yourpackage.YourMainClass")' assembly
这里要注意几个细节:
- 类名必须是全限定类名(包名+类名),而不是.scala文件名。比如你的主类在
com.example包下,类名为SomeApp,就写com.example.SomeApp - 整个
set ...语句要用单引号包裹,避免shell解析时出问题
方法二:自定义专用assembly任务(适合频繁使用的场景)
如果你的项目里有几个固定常用的主类,不如在build.sbt里定义专门的任务,之后调用起来更省心。比如:
// 定义针对App1的assembly任务 lazy val assemblyForApp1 = taskKey[Unit]("生成以App1为主类的可执行jar") assemblyForApp1 := { (assembly in Compile).toTask("").value } assemblyForApp1 := assemblyForApp1.dependsOn(set mainClass in assembly := Some("com.example.App1")).value // 定义针对App2的assembly任务 lazy val assemblyForApp2 = taskKey[Unit]("生成以App2为主类的可执行jar") assemblyForApp2 := { (assembly in Compile).toTask("").value } assemblyForApp2 := assemblyForApp2.dependsOn(set mainClass in assembly := Some("com.example.App2")).value
配置好之后,你只需要运行对应的命令就能快速生成jar包:
# 生成App1的jar sbt assemblyForApp1 # 生成App2的jar sbt assemblyForApp2
额外注意事项
- 确保你的主类包含
main方法,或者继承了Scala的App特质,这样sbt才能识别它作为可执行入口 - 如果遇到找不到主类的错误,先检查全限定类名是否拼写正确,包结构是否和代码一致
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

