запуск Scala с демоном commons из jsvc

Я пытаюсь написать базовое приложение Scala, которое может работать как демон, используя commons-daemon. Следующий код был основан на программе Java в этом сообщении.

package daemon

import org.apache.commons.daemon._ 
import java.util.{ Timer, TimerTask, Date }

class EchoTask extends TimerTask{
  def run() { println(new Date() + " running ...") }
}

object DaemonApp extends App with Daemon {
  val timer = new Timer();
  timer.schedule(new EchoTask(), 0, 1000); 

  def init(daemonContext: DaemonContext) {} 
  def start(){} 
  def stop(){} 
  def destroy(){}
}

это отлично работает, когда я запускаю sbt или создаю банку. Однако я не могу запустить код из jsvc. например, если я запускаю:

$ ./jsvc -cp $DAEMON_HOME/daemon.jar -pidfile $DAEMON_HOME/pidfile -errfile '&2' -outfile '&1' daemon.DaemonApp 

Я получу следующее на stderr

java.lang.NoSuchMethodException: daemon.DaemonApp.init([Ljava.lang.String;)
    at java.lang.Class.getMethod(Class.java:1670)
    at org.apache.commons.daemon.support.DaemonLoader.load(DaemonLoader.java:176)
Cannot load daemon
Service exit with a return value of 3

Я не понимаю, что происходит с искомым методом init(Array[String]). Есть ли что-то в том, как scalac компилирует основной класс, что делает код несовместимым с интерфейсом демона?

Спасибо!


person awfulHack    schedule 14.02.2015    source источник
comment
Содержит ли ваша банка все ваши библиотеки? Если вы запускаете приложение scala через java или что-то подобное, вам может потребоваться добавить стандартную библиотеку scala в путь к классам.   -  person lmm    schedule 14.02.2015
comment
Упаковываю sbt-assembly, библиотека scala в банке. Я сказал в сообщении, что он работает нормально, когда я запускаю банку из java, проблема заключается в том, когда я запускаю из jsvc.   -  person awfulHack    schedule 14.02.2015
comment
Вы нашли решение? Я столкнулся с той же проблемой (но использую maven с плагином сборки)   -  person ppopoff    schedule 02.03.2015


Ответы (2)


Демон должен быть реализован в Scala как класс, а не как объект. Я столкнулся с этим, когда кодировал демона в Scala как объект, чтобы упростить его запуск в среде IDE.

person jimKaravias    schedule 14.03.2017

Я столкнулся с той же проблемой. И похоже, что решение реализует этот класс в java. После этого у меня все работает.

person ppopoff    schedule 02.03.2015