Skip to content

Instantly share code, notes, and snippets.

@ericzhong
Last active December 2, 2021 13:18
Show Gist options
  • Save ericzhong/0112853878e982b7581ca67013af607a to your computer and use it in GitHub Desktop.
Save ericzhong/0112853878e982b7581ca67013af607a to your computer and use it in GitHub Desktop.
sbt 安装与使用

介绍

SBT = Simple Build Tool。用 Scala 编写的一个通用的构建工具,管理项目依赖的 JAR 包,从 Maven 下载。

可以在工程的上下文里启动 REPL (read-eval-print-loop,就是交互式解释器)。

一般用来管理 Scala 项目,类似 Maven 与 Java 的关系。

安装

下载:

wget https://github.com/sbt/sbt/releases/download/v1.0.3/sbt-1.0.3.tgz
tar xvf sbt-1.0.3.tgz
cd sbt/

新建程序 /usr/local/bin/sbt

#!/usr/bin/bash
SBT_OPTS="-Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar /home/vagrant/apps/sbt/bin/sbt-launch.jar "$@"    # 修改路径

设置国内仓库,新建 ~/.sbt/repository

[repositories]
  local
  oschina:http://maven.oschina.net/content/groups/public/
  oschina-ivy:http://maven.oschina.net/content/groups/public/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  repo2:http://repo2.maven.org/maven2/
  ivy-typesafe:http://dl.bintray.com/typesafe/ivy-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  ivy-sbt-plugin:http://dl.bintray.com/sbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  typesafe-releases: http://repo.typesafe.com/typesafe/releases
  typesafe-ivy-releasez: http://repo.typesafe.com/typesafe/ivy-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]

Hello World

运行如下指令创建项目框架:

sbt new sbt/scala-seed.g8     # 要等一会儿。根据提示输入项目名称,比如 hello

产生目录结构如下:

$ tree 
.
├── hello
│   ├── build.sbt
│   ├── project
│   │   ├── build.properties
│   │   └── Dependencies.scala
│   └── src
│       ├── main
│       │   └── scala
│       │       └── example
│       │           └── Hello.scala
│       └── test
│           └── scala
│               └── example
│                   └── HelloSpec.scala
└── target

运行:

$ cd hello
$ sbt
> run
> package   # 生成 JAR 包
> exit

操作

Debug 模式

sbt -debug run

指定其它仓库

新建 ~/.sbt/repositories

[repositories]
central-maven-org: http://central.maven.org/maven2/

或者使用命令选项:

sbt -Dsbt.repository.config=http://central.maven.org/maven2/ run

禁止使用指定仓库以外的仓库(包括默认的)可以再增加选项:

-Dsbt.override.build.repos=true

或者将选项全部放入项目顶层目录的 .sbtopts 文件中:

-Dsbt.repository.config=http://central.maven.org/maven2/
-Dsbt.override.build.repos=true

使用 Java 选项

使用环境变量:

env JAVA_OPTS="-Xmx512m" sbt run

或者新建 /usr/local/etc/sbtopts(>= sbt-0.13.6):

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

或者用命令选项 -J

sbt -J-Xmx2048 -J-XX:MaxPermSize=512 run

或者在 build.sbt 中设置:

javaOptions += "-Xmx1G"
javaOptions in Test += "-Xmx1G"

查看版本

sbt sbtVersion     # 项目 sbt 版本
sbt version        # 项目版本
sbt about          # 项目信息

声明依赖包

下面两种写法都可以,前一种给出了 scala 版本,后一种根据项目的设置自动添加。

libraryDependencies += "org.scala-tools" % "scala-stm_2.11.1" % "0.3"
libraryDependencies += "org.scala-tools" %% "scala-stm" % "0.3"

问题

默认缓存路径

~/.ivy2/cache

Ivy 是一个 Apache 项目,通过描述文件可自动解决 Maven 仓库中的包之间的依赖关系。

Troubleshooting

No sbt.version set in project/build.properties

项目/project/build.properties 中可以强制使用指定版本的 sbt:

sbt.version=0.12.0

object apache is not a member of package org

配置出错了。当前配置和依赖描述的语法是否符合 sbt 版本。

java.lang.RuntimeException: No main class detected.

运行 sbt 命令的目录不对,正确的目录下有 *.sbt 文件。

java.lang.ClassNotFoundException: scala.None$

运行 Spark 任务时报错。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment