使用sbt和Akka Microkernel运行应用程序

时间:2015-01-29 21:25:24

标签: scala sbt akka sbt-native-packager akka-cluster

我可以在我的项目中同时使用它们吗?

以前我只有对象扩展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分别配置,但它没有帮助。

3 个答案:

答案 0 :(得分:0)

一种解决方案是创建另一个模块,将可引导类放入其中并添加其他构建配置:

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"

答案 1 :(得分:0)

我认为你不需要2个模块。

您可以使用以下命令运行微内核

sbt“project backend”“run-main akka.kernel.Main Backend”

答案 2 :(得分:0)

通过sbt console执行这些说明:

runMain akka.kernel.Main Backend