当前位置:首页 > 技术 > 正文内容

Scala项目构建:SBT工具详解

访客 技术 2026年6月16日 1

SBT核心特性

SBT是Scala生态的标准构建工具,提供以下核心能力:

  • 基于Scala DSL的构建脚本
  • 持续编译与测试的触发执行机制
  • 增量编译技术(已独立为Zinc组件)
  • Java/Scala混合项目支持
  • 并行任务处理
  • 兼容Maven/Ivy仓库体系

环境配置

通用安装方法

  1. 获取启动器:
    wget https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.18/sbt-launch.jar
  2. 创建启动脚本:
    # Linux/Unix
    java -Xmx2G -jar $(dirname $0)/sbt-launch.jar "$@"
    
    # Windows(sbt.bat)
    set SCRIPT_DIR=%~dp0
    java -Xmx2G -jar "%SCRIPT_DIR%sbt-launch.jar" %*
    

系统专属安装

# macOS
brew install sbt

# Linux(APT)
sudo apt install sbt

# Windows
下载安装包:https://www.scala-sbt.org/download.html

基础实践

最小化示例

// AppLauncher.scala
object AppLauncher {
  def main(args: Array[String]): Unit = 
    println("构建成功")
}
执行流程:
$ sbt run
[info] 运行 AppLauncher
构建成功

标准项目结构

project-root/
├── build.sbt
├── src/
│   ├── main/
│   │   ├── scala/   # Scala源码
│   │   ├── java/    # Java源码
│   │   └── resources/ # 资源文件
│   └── test/
│       ├── scala/   # 测试代码
│       └── resources/ # 测试资源
└── project/         # 构建定义
    ├── build.properties
    └── plugins.sbt

构建配置示例

// build.sbt
projectName := "data-processor"

version := "1.0.0-RC"

scalaVersion := "2.12.15"

// 添加依赖
libraryDependencies ++= Seq(
  "org.apache.kafka" % "kafka-clients" % "3.2.0",
  "org.scalatest" %% "scalatest" % "3.2.12" % Test
)

// 排除冲突依赖
excludeDependencies ++= Seq(
  ExclusionRule("log4j", "log4j")
)

插件配置

// project/plugins.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.1.0")
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0")

工作流命令

命令功能
compile编译主代码
test执行测试套件
run运行主程序
package生成部署包
~compile启用实时编译

依赖管理

非托管依赖

// 自定义库路径
unmanagedBase := baseDirectory.value / "custom-libs"

托管依赖

libraryDependencies += 
  "mysql" % "mysql-connector-java" % "8.0.29"

// 带作用域的依赖
libraryDependencies += 
  "junit" % "junit" % "4.13.2" % Test

// 跨Scala版本依赖
libraryDependencies += 
  "org.typelevel" %% "cats-core" % "2.7.0"

仓库配置

resolvers += "Akka仓库" at "https://repo.akka.io/maven"
resolvers += "本地Maven" at "file://" + Path.userHome.absolutePath + "/.m2/repository"

高级功能

Scala构建定义

// project/BuildConfig.scala
import sbt._
import Keys._

object ProjectBuilder extends Build {
  lazy val core = Project("core-module", file("core"))
    .settings(scalaVersion := "2.12.15")
  
  lazy val api = Project("api-module", file("api"))
    .dependsOn(core)
}

自定义任务

// 定义任务键
val deployTask = TaskKey[Unit]("deploy", "生成部署包")

// 任务实现
deployTask := {
  val jarFile = (Compile / packageBin).value
  println(s"生成部署包: ${jarFile.getName}")
}

// 集成到项目
lazy val root = project
  .settings(deployTask)

插件开发

// build.sbt(插件项目)
sbtPlugin := true
name := "sbt-deploy-plugin"

// 插件实现
object DeployPlugin extends AutoPlugin {
  object Keys {
    val targetEnv = settingKey[String]("部署环境")
  }
  
  override def projectSettings = Seq(
    Keys.targetEnv := "production"
  )
}

多模块项目

// project/Build.scala
object MultiModuleBuild extends Build {
  lazy val root = project.aggregate(engine, web)
  
  lazy val engine = project
    .settings(libraryDependencies += "io.netty" % "netty" % "4.1.77")
  
  lazy val web = project
    .dependsOn(engine)
    .settings(scalaVersion := "2.12.15")
}
返回列表

上一篇:TcxGrid 常用属性与操作方法详解

没有最新的文章了...

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。