【问题标题】:running Scala with commons-daemon from jsvc使用来自 jsvc 的 commons-daemon 运行 Scala
【发布时间】:2015-02-14 00:54:39
【问题描述】:

我正在尝试编写一个基本的 Scala 应用程序,它可以使用 commons-daemon 作为守护程序运行。以下代码基于java程序in this post

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 运行或构建 jar 时,这工作正常。我无法让代码从 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 编译主类的方式是否导致代码与守护程序接口不兼容?

谢谢!

【问题讨论】:

  • 你的 jar 包含你所有的库吗?如果您通过java 或类似的方式运行 scala 应用程序,您可能需要将 scala 标准库添加到类路径中。
  • 我正在用 sbt-assembly 打包它,scala 库在 jar 中。我确实在帖子中说过,当我从 java 运行 jar 时它运行良好,问题是当我从 jsvc 运行时。
  • 您找到解决方案了吗?我面临同样的问题(但使用 maven 和程序集插件)

标签: scala jsvc apache-commons-daemon


【解决方案1】:

守护进程应该在 Scala 中实现为一个类,而不是一个对象。当我将 Scala 中的守护进程编码为对象以使其易于在 IDE 中运行时,我遇到了这个问题。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。看起来解决方案是在java中实现这个类。之后我就开始工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多