使用 sbt 和 Akka 微内核运行应用程序

Posted

技术标签:

【中文标题】使用 sbt 和 Akka 微内核运行应用程序【英文标题】:Running application with sbt and Akka Microkernel 【发布时间】:2015-03-29 06:42:01 【问题描述】:

我可以在我的项目中同时使用两者吗?

以前我只有扩展 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)

和这样的后端类:

class Backend extends Bootable 

      val system = ActorSystem("mobile-cluster")

      def startup() = 
        FactorialBackend startOn system
      

      def shutdown() = 
        system.shutdown()
      
    

我无法使用 sbt run 启动应用程序(缺少静态 main 方法时出错),但它适用于 Microkernel,当我运行 sbt stage 并下次使用生成的脚本启动应用程序时,它工作正常。

当我使用这样的东西时:

object Backend extends App 

      val system = ActorSystem("application")

      FactorialBackend startOn system
     

我可以使用sbt "project backend" "run" 启动应用程序,但微内核不再工作。

我能用它做什么? 我应该有单独的文件来使用微内核和 sbt 启动应用程序还是单独的构建配置?

我需要有一个使用微内核的应用程序的生产版本,并且我还想在使用 sbt 的开发过程中运行和调试我的应用程序。

我尝试使用相同的类或对象同时扩展 App 和 Bootable trait 或将 sbt.build 配置为对 Microkernel 和 sbt run 进行单独配置,但没有帮助。

【问题讨论】:

【参考方案1】:

一种解决方案是创建另一个模块,将可引导类放在那里并添加额外的构建配置:

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"

【讨论】:

这是一个不错的解决方案。我首先想到了一个伴生对象,它使用App 扩展了您的Bootable 类,并且只执行startup 方法,如果您在引导部分没有太多工作,这是一个很好的解决方案。顺便说一句,感谢您试用我的激活器 :)【参考方案2】:

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

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

sbt "project backend" "run-main akka.kernel.Main Backend"

【讨论】:

【参考方案3】:

通过 sbt 控制台执行这些指令:

runMain akka.kernel.Main Backend

【讨论】:

以上是关于使用 sbt 和 Akka 微内核运行应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 akka-http 模板的新 sbt 应用程序,如何确定解析器并添加 maven Central?

为啥 SBT 的 Scala (2.10) 不包含 Akka?

akka-http 未在 NewRelic 中显示指标

Android 上的 Akka 多参考.conf

使用 Eclipse 设置 Akka

将 akka-sbt-plugin 输出目录压缩为单个 tar(可能使用 sbt-native-packager)?