Skip to content

Instantly share code, notes, and snippets.

@sheepla
Last active May 17, 2025 09:50
Show Gist options
  • Save sheepla/3152ccef0d55c232645acfc611836737 to your computer and use it in GitHub Desktop.
Save sheepla/3152ccef0d55c232645acfc611836737 to your computer and use it in GitHub Desktop.
Scalaで世界に挨拶してみる

Scalaで世界に挨拶してみる

cousierのインストール

coursier はScalaやJavaのパッケージやツール(例:sbt、scala、scala-cli、jvm など)を素早くインストール・管理できるツール。

coursier/coursier - GitHub

# On Linux x86-64 (aka AMD64)
curl -fL "https://github.com/coursier/launchers/raw/master/cs-x86_64-pc-linux.gz" | gzip -d > cs
# On Linux ARM64
curl -fL "https://github.com/VirtusLab/coursier-m1/releases/latest/download/cs-aarch64-pc-linux.gz" | gzip -d > cs
chomd +x cs

cs setup でcoursierをセットアップする。

./cs setup
Checking if a JVM is installed
https://github.com/coursier/jvm-index/raw/master/index.json
  100.0% [##########] 2.6 MiB (2.9 MiB / s)
  No JVM found, should we try to install one? [Y/n] y
https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.7%2B6/OpenJDK21U-jdk_x64_linux_hotspot_2…
  100.0% [##########] 197.3 MiB (14.3 MiB / s)
  Should we update ~/.profile? [Y/n] y
Some shell configuration files were updated. It is recommended to close this terminal once the setup command is done, and open a new one for the changes to be taken into account.

Checking if ~/.local/share/coursier/bin is in PATH
  Should we add ~/.local/share/coursier/bin to your PATH via ~/.profile? [Y/n] y

Checking if the standard Scala applications are installed
  Installed ammonite
  Installed cs
  Installed coursier
  Installed scala
  Installed scalac
  Installed scala-cli
  Installed sbt
  Installed sbtn
  Installed scalafmt

プロジェクトの作成

sbt - A simple build tool

sbt init を実行してプロジェクトを作成する。今回は最小限のScala3アプリケーション (Scala3 seed template) を使うので、 d を選択する。

Welcome to sbt new!
Here are some templates to get started:
 a) scala/toolkit.local               - Scala Toolkit (beta) by Scala Center and VirtusLab
 b) typelevel/toolkit.local           - Toolkit to start building Typelevel apps
 c) sbt/cross-platform.local          - A cross-JVM/JS/Native project
 d) scala/scala3.g8                   - Scala 3 seed template
 e) scala/scala-seed.g8               - Scala 2 seed template
 f) playframework/play-scala-seed.g8  - A Play project in Scala
 g) playframework/play-java-seed.g8   - A Play project in Java
 i) softwaremill/tapir.g8             - A tapir project using Netty
 m) scala-js/vite.g8                  - A Scala.JS + Vite project
 n) holdenk/sparkProjectTemplate.g8   - A Scala Spark project
 o) spotify/scio.g8                   - A Scio project
 p) disneystreaming/smithy4s.g8       - A Smithy4s project
 q) quit
Select a template: d
 q) quit
Select a template: d
A template to demonstrate a minimal Scala 3 application

name [Scala 3 Project Template]: scalahello

Template applied in /tmp/tmp.BMV8miGMCY/./scalahello

メインプログラムを書く

src/main/scala/Main.scala を編集して次の内容を書く。

object Main {
  def main(args: Array[String]): Unit =
    println("Hello, Scala 3.7!")
}

sbtの対話セッションに入り実行してみる

基本的なビルド操作は sbt の対話セッション内で行う。 また、起動時に多少の時間がかかるが、 sbt cleansbt compilesbt run のようにコマンドの引数に内部コマンドを指定することもできる。sbt clean compile のように複数のコマンドを一度に指定してもよい。

cd scalahello
sbt
sbt:ScalaHello> scalaVersion
[info] 3.7.0
sbt:ScalaHello> 

run コマンドでScalaプログラムを実行できる。

sbt:ScalaHello> run
[info] running Main
Hello, Scala 3.7!
[success] Total time: 0 s, completed May 17, 2025, 5:58:07 PM

jarにコンパイルする

Scalaプログラムをjarにコンパイルするには、sbtのアセンブリプラグインを使う。

https://github.com/sbt/sbt-assembly

project/plugins.sbt を編集して、アセンブリプラグインを追加する。

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.5")

プロジェクト直下にある build.sbtを編集して、つぎの内容を書き込む。

val scala3Version = "3.7.0"

lazy val root = project
  .in(file("."))
  .settings(
    name := "ScalaHello",
    version := "0.1.0-SNAPSHOT",

    scalaVersion := scala3Version,

    libraryDependencies += "org.scalameta" %% "munit" % "1.0.0" % Test
  )

// ----------------------------------
// 下記の内容を追加
// ----------------------------------
enablePlugins(AssemblyPlugin) // アセンブリプラグインを追加

mainClass := Some("Main") // エントリーポイントのクラス名を指定

// jarファイル内のファイルが衝突した場合の設定
assemblyMergeStrategy := {
  case PathList("META-INF", _ @ _*) => MergeStrategy.discard
  case _ => MergeStrategy.first
}

sbtの対話セッションに戻り assembly コマンドを実行するとScalaプログラムをjarにコンパイルできる。

sbt:ScalaHello> assembly
[info] 2 file(s) merged using strategy 'Discard' (Run the task at debug level to see the details)
[info] Built: /tmp/tmp.BMV8miGMCY/scalahello/target/scala-3.7.0/ScalaHello-assembly-0.1.0-SNAPSHOT.jar
[info] Jar hash: d1a824ff5938db8b8426a247ba93b4f04a7bd258
[success] Total time: 1 s, completed May 17, 2025, 6:04:41 PM
sbt:ScalaHello>

コンパイルしたjarを実行するには次のようにする。

java -jar target/scala-3.7.0/ScalaHello-assembly-0.1.0-SNAPSHOT.jar
Hello, Scala 3.7!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment