Приложение, которое я сейчас разрабатываю, написано в стиле функционального программирования с использованием scala-cats ' IOApp .
Теперь проблема в том, что мне нужно развернутьэто приложение в контексте OSGi, которое на самом деле не соответствует моему функциональному подходу.
Мой основной метод выглядит следующим образом:
object Main extends IOApp {
override def run(args: List[String]): IO[ExitCode] = for {
_ <- IO(println("Starting with args: " + args.mkString(",")))
myProgram = new MyProgram(/*...*/)
_ <- myProgram.run() // def run(): IO[RunResult]
// ...
_ <- myProgram.exit() // def exit(): IO[Unit]
} yield ExitCode.Success
}
Теперь, чтобы развернуть его в OSGi, мне пришлось написать BundleActivator :
import org.osgi.framework.{BundleActivator, BundleContext}
class Activator extends BundleActivator {
private var myProgram: Option[myProgram] = None
override def start(context: BundleContext): Unit = {
myProgram = Some(new MyProgram(/*...*/))
myProgram.foreach{ _.run().unsafeRunSync() }
}
override def stop(context: BundleContext): Unit = {
myProgram.foreach{ _.exit().unsafeRunSync() }
}
}
Как вы можете видеть, это Activator
, который я придумал, далек от написания функциональным образом.Можно ли как-нибудь избавиться от var myProgram
(изменяемый var
, если быть точным)?Кажется, я не могу понять, как это возможно.
Редактировать: Активатор должен быть определен в манифесте, так что это часть моего build.sbt
:
packageOptions := Seq(ManifestAttributes(
("Bundle-Activator", "my.package.Activator"),
...))