前回の続き通り社内勉強会向けのネタです。今回はサンプルを例に雑にsbtとかプロジェクトの説明の続きをします。

筆者は趣味でしかScalaを使用したことないのでこの記事はいつも以上にアレです

サンプルプロジェクトのクローン


最終目標はAkkaHTTPのサンプルを動かすということで、まず、筆者が突貫で作り上げたサンプルをクローンします。

akka-http-mariadb-circe-example


1
git clone https://github.com/YoshinoriN/akka-http-mariadb-circe-example.git

IntelliJ


次に、クローンしたサンプルプロジェクトをIntelliJで開きます。

「Import Project」を選択します。

クローンしたリポジトリを選択します。

sbtを選択してください。

設定を確認して完了してください。

コンパイル


IntelliJが立ち上がったらターミナルでsbtシェルを起動してください。

1
2
3
4
5
6
7
8
9
10
C:\Users\N.Yoshinori\tmp\akka-http-mariadb-circe-example>sbt
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
[info] Loading settings for project global-plugins from idea.sbt ...
[info] Loading global plugins from C:\Users\N.Yoshinori\.sbt\1.0\plugins
[info] Loading settings for project akka-http-mariadb-circe-example-build from plugin.sbt ...
[info] Loading project definition from C:\Users\N.Yoshinori\tmp\akka-http-mariadb-circe-example\project
[info] Loading settings for project akka-http-mariadb-circe-example from build.sbt ...
[info] Set current project to akka-http-mariadb-circe-example (in build file:/C:/Users/N.Yoshinori/tmp/akka-http-mariadb-circe-example/)
[info] sbt server started at local:sbt-server-aa163069bc9de2a3d98c

sbtシェル起動後は続けてcompileと入力して下さい。ソースコードがコンパイルされます。

1
2
3
4
5
6
7
8
9
10
11
sbt:akka-http-mariadb-circe-example> compile
[info] Compiling 8 Scala sources to C:\Users\N.Yoshinori\tmp\akka-http-mariadb-circe-example\target\scala-2.12\classes ...

...

java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of com.google.protobuf.UnsafeUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[success] Total time: 10 s, completed 2019/04/01 22:19:15
sbt:akka-http-mariadb-circe-example>

build.sbtについて


まず、プロジェクト直下にあるbuild.sbtについて説明します。これはビルドを定義するためのものです。例えばScalaのバージョンや依存ライブラリの指定などです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
val Organization = "net.yoshinorin"
val Name = "akkahttpexample"
val version = "0.0.1"

// Scalaのバージョン
scalaVersion := "2.12.8"

// コンパイラのオプションです
scalacOptions ++= Seq(
"-deprecation",
"-feature",
"-unchecked"
)

// 依存ライブラリ
val circeVersion = "0.11.1"
val akkaVersion = "2.5.21"
val akkaHttpVersion = "10.1.8"
libraryDependencies ++= Seq(
"ch.qos.logback" % "logback-classic" % "1.2.3",
"com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
"com.typesafe.akka" %% "akka-actor" % akkaVersion,
"com.typesafe.akka" %% "akka-stream" % akkaVersion,
"com.typesafe" % "config" % "1.3.3",
"io.circe" %% "circe-core" % circeVersion,
"io.circe" %% "circe-generic" % circeVersion,
"io.circe" %% "circe-parser" % circeVersion,
"io.getquill" %% "quill-jdbc" % "3.1.0",
"org.flywaydb" % "flyway-core" % "6.0.0-beta",
"org.mariadb.jdbc" % "mariadb-java-client" % "2.4.1",
"org.scalatest" %% "scalatest" % "3.0.5" % "test",
"org.slf4j" % "slf4j-api" % "1.7.26"
)

// scalafmtというコードフォーマッタの設定
scalafmtOnCompile := true

マルチプロジェクトのビルドなどもできます。詳しくはドキュメントを見て下さい。

ソースコードのディレクトリ構成について


ソースコードのディレクトリ構成は雑に書くと下記のような感じになります。Mavenのディレクトリ構成に従っています。

1
2
3
4
5
6
7
8
9
10
11
12
src
├── main
│   ├── resources
│   │   └── ...
│   └── scala
│   └── net
│   └── yoshinorin
│   └── akkahttpexample
│   └── ...
└── test
└── scala
└── ...

Javaのパッケージの名前空間はドメインを逆順にしたものする(らしい[1])のでScala以下は私が保有するyoshinorin.netのドメインを逆順にしたものnet.yoshinorinでディレクトリを切っています。

test以下にはテストコードを書きますが、今回のサンプルは時間の都合上テストコードはありません。

target以下について


ビルドの成果物が格納されます。たぶん一般的にgit管理対象外にしていると思います。

つづく


  1. 筆者はJavaどころかJVMの人間でもないので、たぶんです… ↩︎