Запуск приложения с помощью sbt и Akka Microkernel

Могу ли я использовать оба в своем проекте?

Раньше у меня был только объект, расширяющий черту App, но поскольку я начал использовать Microkernel, мне нужно иметь класс, расширяющий черту Bootable.

Допустим, у меня есть что-то вроде этого:

lazy val backend = (project in file("backend"))
  .enablePlugins(AkkaAppPackaging)
  .enablePlugins(UniversalPlugin)
  .settings(
    name := "backend",
    mainClass in Compile := Some("backend.Backend"),
    libraryDependencies ++= Dependencies.backend,
    javaOptions in run ++= Seq("-Djava.library.path=./sigar"),
    fork in run := true)
  .dependsOn(api)
  .aggregate(api)

и класс Backend следующим образом:

class Backend extends Bootable {

      val system = ActorSystem("mobile-cluster")

      def startup() = {
        FactorialBackend startOn system
      }

      def shutdown() = {
        system.shutdown()
      }
    }

Я не могу запустить приложение с sbt run (есть ошибка об отсутствии статического основного метода), но оно работает с Microkernel, когда я запускаю sbt stage и при следующем запуске приложения использую сгенерированный скрипт, он работает нормально.

Когда я использую что-то вроде этого:

object Backend extends App {

      val system = ActorSystem("application")

      FactorialBackend startOn system
    } 

Я могу запустить приложение с sbt "project backend" "run", но микроядро больше не работает.

Что я могу с этим сделать? Должен ли я иметь отдельные файлы для запуска приложения с Microkernel и sbt или отдельные конфигурации сборки?

Мне нужна производственная версия приложения с использованием Microkernel, и я также хочу просто запускать и отлаживать свое приложение во время разработки с использованием sbt.

Я пытался использовать один и тот же класс или объект, расширяющий черты App и Bootable, или настроить sbt.build для отдельной конфигурации для Microkernel и sbt run, но это не помогло.


person Piotr Kozlowski    schedule 29.01.2015    source источник


Ответы (3)


Одно из решений — создать еще один модуль, поместить туда загрузочный класс и добавить дополнительную конфигурацию сборки:

lazy val backend = (project in file("backend"))
  .settings(
    name := "backend",
    libraryDependencies ++= Dependencies.backend,
    javaOptions in run ++= Seq("-Djava.library.path=./sigar"),
    // this enables custom javaOptions
    fork in run := true)
  .dependsOn(api)
  .aggregate(api)

lazy val boot = (project in file("boot"))
  .enablePlugins(AkkaAppPackaging)
  .enablePlugins(UniversalPlugin)
  .settings(
    name := "boot",
    mainClass in Compile := Some("com.example.Boot"),
    libraryDependencies ++= Dependencies.backend,
    // this enables custom javaOptions
    fork in run := true)
  .dependsOn(backend)
  .aggregate(api, backend)

Прямо сейчас я могу бежать

sbt "project backend" "run"

а также

sbt "project boot" "stage"
person Piotr Kozlowski    schedule 29.01.2015
comment
Это хорошее решение. Сначала я подумал о сопутствующем объекте, расширяющем ваш класс Bootable с помощью App, и просто выполняет метод startup, что является прекрасным решением, если у вас мало чего происходит в разделе загрузки. Кстати, спасибо, что попробовали мой активатор :) - person Muki; 30.01.2015

Я не думаю, что вам нужно 2 модуля для этого.

вы можете запустить микроядро с помощью следующей команды

sbt "серверная часть проекта" "run-main akka.kernel.Main Backend"

person integratingweb    schedule 12.03.2015

Выполните эти инструкции с помощью консоли sbt:

runMain akka.kernel.Main Backend
person Dmitry    schedule 28.06.2015