【问题标题】:Running application with sbt and Akka Microkernel使用 sbt 和 Akka 微内核运行应用程序
【发布时间】: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 进行单独配置,但没有帮助。

【问题讨论】:

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


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 2017-01-06
        • 2017-03-02
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        相关资源
        最近更新 更多