4

我只是下载了 JSW 社区版,解包到一个目录中:
c:\servicetest
所以这里我有一个 bin、conf、lib 和 log 子目录等。从现在开始,这将是(根)。
我将 (root)/lib/wrapper.jar 引用到我的 ide (netbeans) 中并创建了一个非常简单的服务(记住类名是 Main):

public class Main extends WrapperSimpleApp {

public Main(String[] args) {
    super(args);
}

@Override
public void run() {

    while(true) {
        Logger.getLogger(Main.class.getName()).log(Level.INFO, "I'm alive");

        try 
           { Thread.sleep(2000); } 
        catch (InterruptedException ex) 
           { return; }
    }
}

}

如您所见,它基本上只记录一条消息。但实际上它都没有开始。

我编译了项目(MyProject.jar),将 jar 复制到(根)目录并修改了(根)/config/wrapper.conf 添加:

wrapper.java.classpath.3=../MyProject.jar

wrapper.java.mainclass=textappender.Main

然后我在命令行中安装了该服务,其中:

C:\servicetest\bin>wrapper -i ../conf/wrapper.conf

然后我通过 services.msc 控制面板或通过

C:\servicetest\bin>wrapper -t ../conf/wrapper.conf

在 logs/wrapper.log 我得到:

ERROR  | wrapper  | 2012/05/21 21:35:11 | JVM exited while loading the application.

更新 1

按照 Tanuki Software 的建议,我在我的 (root)/config/wrapper.conf 中进行了设置(好吧,因为它已经存在,所以没有注释):

wrapper.debug=TRUE

现在我明白了:

INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: WrapperManager.stop(1) called by thread: main
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: Backend not connected, not sending packet STOP : 1
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: Stopped checking for  control events.
DEBUG  | wrapper  | 2012/05/22 10:46:37 | Pause reading child process output to share cycles.
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: Thread, main, handling the shutdown process.
INFO   | jvm 1    | 2012/05/22 10:46:37 | WrapperManager Debug: shutdownJVM(1) Thread: main
INFO   | jvm 1    | 2012/05/22 10:46:38 | WrapperManager Debug: wait for 0 shutdown locks to be released.
INFO   | jvm 1    | 2012/05/22 10:46:38 | WrapperManager Debug: Backend not connected, not sending packet STOPPED : 1
INFO   | jvm 1    | 2012/05/22 10:46:38 | WrapperManager Debug: calling System.exit(1)
DEBUG  | wrapper  | 2012/05/22 10:46:38 | JVM process exited with a code of 1, setting the wrapper exit code to 1.

但鉴于我的实现非常简单,我无法猜测出了什么问题。

4

1 回答 1

2

而不是扩展 WrapperSimpleApp,你的主类应该实现 org.tanukisoftware.wrapper.WrapperListener 接口。

您可以在我们的网站上找到关于实现接口的非常详细的描述: http ://wrapper.tanukisoftware.com/doc/english/integrate-listener.html

如果您对 conf 文件中的实现和/或配置属性有任何疑问,请告诉我。

有时对我有用的另一个建议是,与其立即将您的应用程序作为服务运行,我发现通过首先作为控制台应用程序运行来进行集成更容易,因为您可以直接在控制台上看到输出。一旦一切正常,我继续安装/作为服务运行。要作为控制台应用程序运行,您将运行例如:

C:\servicetest\bin>wrapper -c ../conf/wrapper.conf

您还可以通过设置打开 Wrapper 的调试输出

wrapper.debug=true

在你的 conf 文件中。

由于评论而编辑:

如果您的应用程序实际上像您描述的那样简单,那么只需将您的应用程序编写为普通的 Java 应用程序,而不需要任何 Wrapper API 部分。

您可以使用 WrapperSimpleApp 开箱即用地运行您的应用程序,并将无代码集成到 Wrapper 中。

您需要做的就是在您的 conf 文件中设置以下属性:

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=textappender.Main
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../MyProject.jar

使用此配置,Wrapper 将能够将您的应用程序作为 Windows 服务运行。

更新2

我不确定您的代码到底是什么样子,但您似乎在主类中调用 WrapperManager.stop() ......

在最初的示例类之后,我修改了该类,因此它没有使用任何 Wrapper-API(对于简单的应用程序来说,这不是必需的):

public class Main {    
public static void main(String[] args) {
    while(true) {
        Logger.getLogger(Main.class.getName()).log(Level.INFO, "I'm alive");
        try 
        { Thread.sleep(2000); } 
        catch (java.lang.InterruptedException ex) 
        { return; }
    }
}
}

编译并创建 jar 后,conf 文件中的必要属性为:

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=textappender.Main
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../MyProject.jar

干杯,

于 2012-05-22T01:50:41.860 回答