我简单地下载了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复制到(root)目录并修改了(root)/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.
根据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.
但鉴于我的实施非常简单,我无法猜出出了什么问题。
答案 0 :(得分: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.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服务运行。
UPDATE2
我不确定你的代码究竟是什么样的,但是你似乎在主类中调用了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
欢呼声,