игровая среда в подпроекте sbt - загрузчик приложения не определен - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь создать проект Play Framework в качестве подпроекта sbt.

В качестве минимальной конфигурации я создал этот build.sbt:

name := """api-skeleton"""
organization := "my.domain"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).aggregate(api)
lazy val api = (project in file("api")).enablePlugins(PlayScala)

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test

scalaVersion := "2.13.1"

Запуск sbt project api run Play Framework начинается как Ожидается, сообщает мне, что прослушивает порт 9000 и ждет запросов. Отправка запроса к нему приведет к этому сообщению об ошибке:

java.lang.RuntimeException: No application loader is configured. Please configure an application loader either using the play.application.loader configuration property, or by depending on a module that configures one. You can add the Guice support module by adding "libraryDependencies += guice" to your build.sbt.
     scala.sys.package$.error(package.scala:30)
     play.api.ApplicationLoader$.play$api$ApplicationLoader$$loaderNotFound(ApplicationLoader.scala:51)
     play.api.ApplicationLoader$.apply(ApplicationLoader.scala:159)
     play.core.server.DevServerStart$$anon$1.$anonfun$reload$3(DevServerStart.scala:188)
     play.utils.Threads$.withContextClassLoader(Threads.scala:21)
     play.core.server.DevServerStart$$anon$1.reload(DevServerStart.scala:181)
     play.core.server.DevServerStart$$anon$1.get(DevServerStart.scala:141)
     play.core.server.AkkaHttpServer.handleRequest(AkkaHttpServer.scala:296)
     play.core.server.AkkaHttpServer.$anonfun$createServerBinding$1(AkkaHttpServer.scala:186)
     akka.stream.impl.fusing.MapAsync$$anon$30.onPush(Ops.scala:1261)
     akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:541)
     akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:423)
     akka.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:624)
     akka.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:501)
     akka.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:599)
     akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:768)
     akka.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:783)
     akka.actor.Actor.aroundReceive(Actor.scala:533)
     akka.actor.Actor.aroundReceive$(Actor.scala:531)
     akka.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:690)
     akka.actor.ActorCell.receiveMessage(ActorCell.scala:573)
     akka.actor.ActorCell.invoke(ActorCell.scala:543)
     akka.dispatch.Mailbox.processMailbox(Mailbox.scala:269)
     akka.dispatch.Mailbox.run(Mailbox.scala:230)
     akka.dispatch.Mailbox.exec(Mailbox.scala:242)
     java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
     java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
     java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
     java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

Поиск в этом сообщении (и его чтение) говорит мне, что мне нужно добавить подсказку в мой проект. Что я и сделал, как видно в build.sbt. Также кое-что об удалении целевых папок в аналогичном StackQuestion, которое я тоже пытался.

1 Ответ

0 голосов
/ 21 января 2020

Проблема, с которой я столкнулся, была вызвана тем, что libraryDependencies не использовался для всех проектов, как я предполагал. Таким образом, guice никогда не загружался, и сообщение об ошибке было довольно точным.

Чтобы загрузить подсказку для подпроекта, я создал файл зависимостей в каталоге моих проектов с именем Dependencies.scala. Это выглядит так:

import sbt._
import play.sbt.PlayImport._

object Dependencies {
  val play: Seq[ModuleID] = Seq(
    guice
  )
}

Теперь я могу предоставить своему подпроекту зависимости, сделав это в моем build.sbt:

lazy val api = project
  .enablePlugins(PlayScala)
  .settings(
    libraryDependencies ++= Dependencies.play
  )

И теперь это работает.

...