Scalaビルドツールsbt(simple build tool)のティップス
Scala導入ティップスの記事でも紹介したsbtについて、別途ここで纏めます。
sbtリファレンス
https://www.scala-sbt.org/1.x/docs/
参考ブログ: sbt
SDKMANによるインストール
SDKMANのインストールについてもScala導入ティップスの記事を参照して下さい。
インストールするsbtのバージョンを確認します。
$sdk list sbt
================================================================================
Available Sbt Versions
================================================================================
1.4.4 1.3.4 1.1.2
1.4.3 1.3.3 1.1.1
1.4.2 1.3.1 1.1.0
1.4.1 1.3.0 * 1.0.4
1.4.0 1.2.8 1.0.3
1.4.0-RC2 1.2.7 1.0.2
* 1.3.13 1.2.6 1.0.1
1.3.12 1.2.5 1.0.0
1.3.11 1.2.4 > * 0.13.18
1.3.10 1.2.3 0.13.17
1.3.9 1.2.1
1.3.8 1.2.0
1.3.7 1.1.6
1.3.6 1.1.5
1.3.5 1.1.4
================================================================================
+ - local version
* - installed
> - currently in use
複数バージョンのインストールが可能です。バージョンの切り換えは、バージョンを指定して defaultコマンド で行います。
$sdk default sbt 1.3.13
sdkヘルプ一覧
Usage: sdk <command> [candidate] [version]
sdk offline <enable|disable>
commands:
install or i <candidate> [version] [local-path]
uninstall or rm <candidate> <version>
list or ls [candidate]
use or u <candidate> <version>
default or d <candidate> [version]
home or h <candidate> <version>
env or e [init]
current or c [candidate]
upgrade or ug [candidate]
version or v
broadcast or b
help
offline [enable|disable]
selfupdate [force]
update
flush [archives|tmp|broadcast|version]
candidate : the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
use list command for comprehensive list of candidates
eg: $ sdk list
version : where optional, defaults to latest stable if not provided
eg: $ sdk install groovy
local-path : optional path to an existing local installation
eg: $ sdk install groovy 2.4.13-local /opt/groovy-2.4.13
sbtシェルからscalaシェルへ
$ sbt console
scala>
またはsbtにてsbtシェル起動後consoleコマンドを入力
$ sbt
[info] welcome to sbt 1.3.13 (AdoptOpenJDK Java 11.0.9.1)
[info] loading global plugins from /home/takanobu/.sbt/1.0/plugins
[info] loading settings for project chapter-cluster-build from plugins.sbt ...
[info] loading project definition from /home/takanobu/IdeaProjects/akka-in-action/chapter-cluster/project
[info] loading settings for project chapter-cluster from scala.sbt,build.sbt ...
[info] set current project to words-cluster (in build file:/home/takanobu/IdeaProjects/akka-in-action/chapter-cluster/)
[info] sbt server started at local:///home/takanobu/.sbt/1.0/server/540c81ed307cf8174db4/sock
sbt:words-cluster> console
[info] Compiling 6 Scala sources to /home/takanobu/IdeaProjects/akka-in-action/chapter-cluster/target/scala-2.13/classes ...
[info] Non-compiled module 'compiler-bridge_2.13' for Scala 2.13.4. Compiling...
[info] Compilation completed in 18.928s.
[info] Starting scala interpreter...
Welcome to Scala 2.13.4 (OpenJDK 64-Bit Server VM, Java 11.0.9.1).
Type in expressions for evaluation. Or try :help.
scala>
github等に公開されているプログラムをIntelliJにて検証する際に、sbtのバージョンを変更しなければならない場合があります。
その場合、SDKMANにより指定バージョンをインストール、
以下 Launcher(sbt-launcher.jar)
の項目で、 Custom
を選択、SDKMANでインストールした sbt バージョンの sbt-launcher-.jar へのパス
/home/<user_name>/.sdkman/candidates/sbt/1.3.13/bin/sbt-launch.jar
を指定します。
run, runMain
以下サンプルコードによるsbtコマンドの使用例
Cluster Client with gRPC transport
run
Scalaコンソールにて"run"実行コマンド入力、複数のファイルにまたがり、オブジェクトで定義したメイン関数を尋ねてくるので希望の数値を入力して選択
sbt:akka-grpc-quickstart-scala> run
Multiple main classes detected. Select one to run:
[1] com.example.helloworld.GreeterClient
[2] com.example.helloworld.GreeterServer
Enter number: 1
[info] running com.example.helloworld.GreeterClient
......
runMain
予めメイン関数を含むオブジェクトを指定して起動
sbt:akka-grpc-quickstart-scala> runMain com.example.helloworld.GreeterServer
[info] running com.example.helloworld.GreeterServer
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
(gRPC server bound to {}:{},127.0.0.1,8080)
sbtプラグイン: sbt-revolver
sbtシェルのバックグラウンドでアプリを動作 reStart 。動作停止 reStop 、ステータス確認 reStatus などを同シェルで出来るようになります。
プロジェクトディレクトリに project/plugins.sbt
を作成し、以下のフォーマットでプラグインとそのバージョンを指定。
https://www.scala-sbt.org/1.x/docs/Using-Plugins.html
sbt-revolver
addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")
追加コマンド
reStart — starts your application in a forked JVM. The optionally specified (JVM) arguments are appended to the ones configured via the reStartArgs/ reStart::javaOptions setting (see the “Configuration” section below). If the application is already running it is first stopped before being restarted.
reStop stops application. This is done by simply force-killing the forked JVM. Note, that this means that shutdown hooks are not run (see #20).
reStatus shows an informational message about the current running state of the application.
Community Plugins
https://www.scala-sbt.org/1.x/docs/Community-Plugins.html
Plugins available for sbt 1.0 (including RC-x)
Code formatter plugins
Documentation plugins
- tut: documentation and tutorial generator.
- Laika: Transform Markdown or reStructuredText
into HTML or PDF with Templating.
- sbt-site: site generator.
- sbt-microsites: generate
and publish microsites using Jekyll.
- sbt-unidoc: create unified API
documentation across subprojects.
- sbt-ghpages: publish generated
sites to GitHub pages.
- sbt-class-diagram: generate
class diagrams from Scala source code.
- sbt-api-mappings:
generate Scaladoc apiMappings
for common Scala libraries.
- literator:
generate literate-style markdown docs from your sources.
- sbt-example:
generate ScalaTest test suites from examples in Scaladoc.
- sbt-delombok:
delombok Java sources files that contain Lombok annotations to make Javadoc contain Lombok-generated classes and methods.
- sbt-alldocs: collect all the docs for a project and dependencies into a single folder.
- sbt-apidoc: A port of apidocjs to sbt, to document REST Api.
- sbt-github-pages
(docs): publish a website to GitHub Pages with minimal effort - works well with GitHub Actions.
- sbt-docusaur
(docs): build a website using Docusaurus and publish to GitHub Pages with minimal effort - works well with GitHub Actions.
One jar plugins
Release plugins
Deployment integration plugins
- sbt-heroku: deploy applications
directly to Heroku.
- sbt-docker-compose:
launch Docker images using docker compose.
- sbt-appengine
deploy your webapp to Google App Engine.
- sbt-marathon: deploy applications
on Apache Mesos using the Marathon
framework.
- sbt-riotctl: deploy
applications as systemd services directly to a Raspberry Pi, ensuring
dependencies (e.g. wiringpi) are met.
Utility and system plugins
IDE integration plugins
Test plugins
- scripted: integration testing for sbt plugins.
- sbt-jmh: run Java Microbenchmark Harness
(JMH) benchmarks from sbt.
- sbt-doctest: generate and run
tests from Scaladoc comments.
- gatling-sbt: performance and
load-testing using Gatling.
- sbt-multi-jvm: run tests using
multiple JVMs.
- sbt-scalaprops: scalaprops
property-based testing integration.
- sbt-testng: TestNG framework
integration.
- sbt-jcstress: Java Concurrency
Stress Test (jcstress) integration.
- sbt-stryker4s: Test your tests with mutation testing.
- sbt-cached-ci: Incremental sbt builds for CI environments.
Library dependency plugins
Web and frontend development plugins
Database plugins
Framework-specific plugins
- sbt-newrelic: NewRelic support for
artefacts built with sbt-native-packager.
- sbt-spark: Spark application
configurator.
- sbt-api-builder: support for
ApiBuilder from within sbt’s shell.
Code generator plugins
Static code analysis plugins
Code coverage plugins
Create new project plugins
- sbt-fresh: create an opinionated fresh
sbt project.
In-house plugins
Verification plugins
Language support plugins
- sbt-frege: build Frege
code with sbt.
- sbt-cc: compile C and C++ source files with sbt.
Resolvers
https://www.scala-sbt.org/1.x/docs/Library-Dependencies.html#Resolvers
sbt追加レポジトリ
resolvers += name at location
Ex)
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
sbtコマンドリファレンス
https://www.scala-sbt.org/release/docs/Command-Line-Reference.html#Command+Line+Reference
プロジェクトディレクトリ内でコマンド実行
$ sbt compile
...
$ sbt run
...
$ sbt package
...
compile
Compiles the main sources (in the src/main/scala directory). test:compile compiles test sources (in the src/test/scala/ directory).
console
Starts the Scala interpreter with a classpath including the compiled sources, all jars in the lib directory, and managed libraries. To return to sbt, type :quit, Ctrl+D (Unix), or Ctrl+Z (Windows). Similarly, test:console starts the interpreter with the test classes and classpath.
package
Creates a jar file containing the files in src/main/resources and the classes compiled from src/main/scala. test:package creates a jar containing the files in src/test/resources and the class compiled from src/test/scala.
packageSrc
Creates a jar file containing all main source files and resources. The packaged paths are relative to src/main/scala and src/main/resources. Similarly, test:packageSrc operates on test source files and resources.
run <argument>
Runs the main class for the project in the same virtual machine as sbt. The main class is passed the arguments provided. Please see Running Project Code for details on the use of System.exit and multithreading (including GUIs) in code run by this action. test:run runs a main class in the test code.
runMain <main-class> <argument>
Runs the specified main class for the project in the same virtual machine as sbt. The main class is passed the arguments provided. Please see Running Project Code for details on the use of System.exit and multithreading (including GUIs) in code run by this action. test:runMain runs the specified main class in the test code.
sbtプラグイン:sbt-assembly
https://www.scala-sbt.org/1.x/docs/Plugins.html#Plugins
project/plugin.sbt に以下追加
...
...
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0")
sbt-assemblyによる Jarファイル作成のため build.sbt に以下追加
...
...
...
// Assembly settings
mainClass in assembly := Some("aia.cluster.words.Main")
assemblyJarName in assembly := "words-node.jar"
Jarファイル作成
$ sbt assembly
Jarファイルの実行
$ java -DPORT=2551 -Dconfig.resource=/seed.conf -jar target/scala-2.13/words-node.jar