マルチプロジェクト構成時に、サブプロジェクト内のクラスを実行する

# サブプロジェクトのクラスを実行できない

以下のような`build.sbt`を用意する。
`http`プロジェクトは`akka-http`を含んでおり、当アプリケーションの実行時は`akka-http`のWEBサーバーを起動したい。

```scala: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")
```

これを普通に実行すると以下のように失敗する。
ルートプロジェクトからサブプロジェクト内のモジュールが見えていないみたい。

``` bash:
 > 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](https://www.scala-sbt.org/1.0/docs/ja/Scopes.html#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E8%BB%B8)

`run`する際に実行したいプロジェクトのIDを指定して実行することで、サブプロジェクトのプログラムを実行することができる。

``` bash:
 > sbt http/run                                                                                                                                                                                                                (〜省略〜)

Server online at http://0.0.0.0/5000/
Press RETURN to stop...
```

`http`がアプリケーションのエントリーポイントであることを明確にするために、`mainClass`はサブプロジェクトの宣言内に入れてしまった方が明示的でわかりやすい。

```scala: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")
```