サブプロジェクトのクラスを実行できない
以下のようなbuild.sbt
を用意する。
http
プロジェクトはakka-http
を含んでおり、当アプリケーションの実行時はakka-http
のWEBサーバーを起動したい。
build.sbt
val baseName = "fp"
lazy val domain = ...
lazy val application = ...
lazy val entity = ...
lazy val http = (project in file("modules/infrastructure/http"))
.settings(
...
)
)
lazy val `root` = (project in file("."))
.settings(
name := baseName
)
.settings(coreSettings)
.aggregate(
domain,
application,
entity,
http
)
mainClass in Compile := Some("com.louvre2489.fp.infrastructure.http.WebServer")
これを普通に実行すると以下のように失敗する。
ルートプロジェクトからサブプロジェクト内のモジュールが見えていないみたい。
> sbt run (git)-[master]
[info] Loading settings for project global-plugins from idea.sbt ...
[info] Loading global plugins from /home/nori/.sbt/1.0/plugins
[info] Loading settings for project fp-build from plugins.sbt ...
[info] Loading project definition from /home/nori/workspace/scala/fp/project
[info] Loading settings for project root from build.sbt ...
[info] Set current project to fp (in build file:/home/nori/workspace/scala/fp/)
[info] Packaging /home/nori/workspace/scala/fp/target/scala-2.12/fp_2.12-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running com.louvre2489.fp.infrastructure.http.WebServer
[error] (run-main-0) java.lang.ClassNotFoundException: com.louvre2489.fp.infrastructure.http.WebServer
[error] java.lang.ClassNotFoundException: com.louvre2489.fp.infrastructure.http.WebServer
[error] at java.base/java.lang.ClassLoader.findClass(ClassLoader.java:709)
[error] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:563)
[error] Nonzero exit code: 1
[error] (Compile / run) Nonzero exit code: 1
[error] Total time: 1 s, completed 2019/03/02 16:22:59
サブプロジェクトを指定して実行する
「サブプロジェクト軸」を指定することで、任意のサブプロジェクトに対する操作を行うことができる。
sbt Reference Manual
run
する際に実行したいプロジェクトのIDを指定して実行することで、サブプロジェクトのプログラムを実行することができる。
> sbt http/run (〜省略〜)
Server online at http://0.0.0.0/5000/
Press RETURN to stop...
http
がアプリケーションのエントリーポイントであることを明確にするために、mainClass
はサブプロジェクトの宣言内に入れてしまった方が明示的でわかりやすい。
build.sbt
val baseName = "fp"
lazy val domain = ...
lazy val application = ...
lazy val entity = ...
lazy val http = (project in file("modules/infrastructure/http"))
.settings(
mainClass in Compile := Some("com.louvre2489.fp.infrastructure.http.WebServer"),
...
)
)
lazy val `root` = (project in file("."))
.settings(
name := baseName
)
.settings(coreSettings)
.aggregate(
domain,
application,
entity,
http
)
// mainClass in Compile := Some("com.louvre2489.fp.infrastructure.http.WebServer")