- 浏览: 327088 次
- 性别:
- 来自: 广州
文章分类
最新评论
http://blog.csdn.net/small____fish/article/details/8149143
你是不是在找将Java程序注册成系统服务的方法?试试Java Service Wrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了适合市面上流行的操作系统的版本。
你是不是在找将Java程序注册成系统服务的方法?试试Java Service Wrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了适合市面上流行的操作系统的版本。
使用Wrapper将Java程序注册成系统服务有三种方式可供选择:
第一种是使用WrapperSimpleApp 这个帮助类来运行你的程序,这个是最简单的方法,也是官方推荐使用的方式,但是这样可能会对你的程序有改动,如果你在项目初期就开始考虑的话,这个方法还是不错的。像JBoss也是使用这种方式。
第二种方式是使用WraperStartStopApp这个类来实现功能,这个方法适合那些通过ClassA类来负责启动服务,ClassB类来负责停止服务的应用场景。
我使用的是第三种方式,这种方式好处是对程序改动比较小,只要让你的启动类实现WrapperListener接口,并实现接口中的start(String[] args) 和 stop(String [] args)方法,然后通过WrapperManager来启动。其他的一些配置比如要运行的主类全名、Java类路径、依赖Java库的路径、还有服务显示的名称,都可以通过配置文件conf/wrapper.conf来配置,相对来说比较灵活,像我目前在做的RCP项目有自动更新功能,更新下来的插件要比那些原来的插件的版本号要更新,虽然说会定期删除那些过期的插件,但有时还是会产生延迟,那么配置文件里面配置的Java类路径必须也要链接到最新的插件的地址,我是通过一个Java类来管理这个wrapper.confg文件,如果有更新的插件,通过Java类来得到最新插件的路径,将这些信息写入到wrapper.confg文件中,这样就能保证配置文件中的类路径是最新的了。
下面是程序的结构
这里主页介绍一下wrapper.conf的配置,这个配置文件是Java常用的属性文件格式,
wrapper.java.command=java: 指定要运行的Java,如果你不想设置环境变量的话,你也可以指定JDK的bin文件路径
wrapper.java.mainclass=test.Main: 指定要运行的类,这个类必须实现WrapperListener接口和接口中的start和stop方法,通过WrapperManager类来初始化服务。如果启动服务过程中出现与不能取得JVM信息的情况,可能是接口实现的问题。
wrapper.java.classpath.1=……/lib/wrapper.jar:配置Java的类路径,这里的将wrapper.jar也包含在内,这里可以设置参数的位置,而且这个位置必须得从1 开始,不能跳过,必须顺序指定,指定类路径的时候还有根据依赖关系来排列,被依赖的排在前面,否则会出现ClassNotFoundException的错误,这里支持觉得路径和相对路径,也支持通配符"*",比如wrapper.java.classpath.1=……/lib/wrapper*,不过这个通配符只能用于匹配文件名,不能用于匹配文件夹名称。
wrapper.java.library.path.1=……/lib:指定Wrapper自带的类库文件存放文件夹,比如Wrapper.DLL文件等,只要指定到对应的上级目录名称就行,支持通配符。
wrapper.java.library.path.1=……/lib:指定Wrapper自带的类库文件存放文件夹,比如Wrapper.DLL文件等,只要指定到对应的上级目录名称就行,支持通配符。
wrapper.app.parameter.1= :指定运行类的main方法参数。
wrapper.daemonize=TRUE:将服务注册成守护线程,就算程序关闭的话不影响服务的运行
wrapper.ntservice.hide-console=false:不显示控制台
wrapper.filter.trigger.1= , wrapper.filter.action.1 :指定过滤器和触发器,可以对控制台的输出信息进行监听,然后触发相应的操作
wrapper.disable_shutdown_hook=TRUE:是否禁用 "关闭Hook" ,关闭的话在出现一般异常的情况下面可以忽略掉异常继续执行
wrapper.console.loglevel=INFO:配置控制台的显示信息的级别,NONE不显示任何输出信息,FATAL只显示致命的错误消息,ERROR显示所有的错误消息,STATUS显示服务状态的改变,包括服务启动和停止等信息,INFO显示所有程序输出的信息和JVM显示的信息,如果程序无法正常启动,可以使用DEBUG显示详细的调试信息。
wrapper.logfile.loglevel=INFO:配置日志记录文件要记录的输出信息的级别,参数值和wrapper.console.loglevel功能一致
wrapper.logfile.maxsize=0:配置日志文件的最大大小,如果为0表示不限制日志文件的大小,支持标记符,“k”代表KB,“m”代表MB,如果要设置最大大小为100KB的话可以这样:wrapper.logfile.maxsize=100k
wrapper.console.title=Wrapper Demo :控制台窗口显示标题,
wrapper.ntservice.name=testwrapper: 系统服务的名称,
wrapper.ntservice.displayname=Wrapper Demo:在服务管理中显示的名称
wrapper.ntservice.description=Wrapper Demo的介绍信息: 在服务管理器显示服务的描述信息
wrapper.ntservice.starttype=AUTO_START: 配置服务启动方式,可以选择AUTO_START(自动)和DEMAND_START(手动)两种方式。默认为自动。
前几天在看Jetty源代码的时候发现它也是使用Wrapper注册成系统服务,使用的是第三种方式,可以参考一下
import java.io.PrintStream;
import org.mortbay.jetty.Server;
import org.mortbay.start.Main;
import org.tanukisoftware.wrapper.WrapperListener;
import org.tanukisoftware.wrapper.WrapperManager;
public class JettyServiceWrapperListener implements WrapperListener {
private static Server __server = null;
public void controlEvent(int event) {
if ((WrapperManager.isControlledByNativeWrapper()) || ((event != 200) && (event != 201) && (event != 203)))
return;
WrapperManager.stop(0);
}
public Integer start(String[] args) {
for (int i = 0; i < args.length; ++i) {
System.out.println("ARG[" + i + "] = " + args[i]);
}
Main.main(args);
return null;
}
public int stop(int code) {
try {
System.out.println("JettyServiceWrapperListener: Stopping Jetty 6 Service!!!");
__server.stop();
System.out.println("JettyServiceWrapperListener: Jetty 6 Service Stopped!!!");
return code;
}
catch (Exception e) {
System.out.println("Stop Server Error");
e.printStackTrace();
}
return -1;
}
public static void setServer(Server server) {
__server = server;
}
public static Server getServer() {
return __server;
}
public static void main(String[] args) {
String[] newStrArgs = new String[args.length + 1];
newStrArgs[0] = System.getProperty("jetty.home") + "etc/jetty-win32-service.xml";
for (int i = 0; i < args.length; ++i) {
newStrArgs[(i + 1)] = args[i];
}
WrapperManager.start(new JettyServiceWrapperListener(), newStrArgs);
}
}
这个类实现了Wrapper的WrapperListener 并实现了它的start和stop方法,start方法在服务器启动的时候调用,不过这里要注意,如果在30秒内你不能执行完start方法,系统会自动放弃这个服务的启动,解决办法可以在start方法使用线程,将比较耗时的操作放在这个线程执行,比如加载Spring文件等。而且如果在start方法执行出现异常,会终止服务的运行。这点要注意。
Stop方法在服务停止启动,start和stop方法的参数可以在wrapper.conf文件里面配置。一般按照这样配置的话你的程序应该可以通过执行StartApp-NT.bat正常启动了。
你是不是在找将Java程序注册成系统服务的方法?试试Java Service Wrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了适合市面上流行的操作系统的版本。
你是不是在找将Java程序注册成系统服务的方法?试试Java Service Wrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了适合市面上流行的操作系统的版本。
使用Wrapper将Java程序注册成系统服务有三种方式可供选择:
第一种是使用WrapperSimpleApp 这个帮助类来运行你的程序,这个是最简单的方法,也是官方推荐使用的方式,但是这样可能会对你的程序有改动,如果你在项目初期就开始考虑的话,这个方法还是不错的。像JBoss也是使用这种方式。
第二种方式是使用WraperStartStopApp这个类来实现功能,这个方法适合那些通过ClassA类来负责启动服务,ClassB类来负责停止服务的应用场景。
我使用的是第三种方式,这种方式好处是对程序改动比较小,只要让你的启动类实现WrapperListener接口,并实现接口中的start(String[] args) 和 stop(String [] args)方法,然后通过WrapperManager来启动。其他的一些配置比如要运行的主类全名、Java类路径、依赖Java库的路径、还有服务显示的名称,都可以通过配置文件conf/wrapper.conf来配置,相对来说比较灵活,像我目前在做的RCP项目有自动更新功能,更新下来的插件要比那些原来的插件的版本号要更新,虽然说会定期删除那些过期的插件,但有时还是会产生延迟,那么配置文件里面配置的Java类路径必须也要链接到最新的插件的地址,我是通过一个Java类来管理这个wrapper.confg文件,如果有更新的插件,通过Java类来得到最新插件的路径,将这些信息写入到wrapper.confg文件中,这样就能保证配置文件中的类路径是最新的了。
下面是程序的结构
这里主页介绍一下wrapper.conf的配置,这个配置文件是Java常用的属性文件格式,
wrapper.java.command=java: 指定要运行的Java,如果你不想设置环境变量的话,你也可以指定JDK的bin文件路径
wrapper.java.mainclass=test.Main: 指定要运行的类,这个类必须实现WrapperListener接口和接口中的start和stop方法,通过WrapperManager类来初始化服务。如果启动服务过程中出现与不能取得JVM信息的情况,可能是接口实现的问题。
wrapper.java.classpath.1=……/lib/wrapper.jar:配置Java的类路径,这里的将wrapper.jar也包含在内,这里可以设置参数的位置,而且这个位置必须得从1 开始,不能跳过,必须顺序指定,指定类路径的时候还有根据依赖关系来排列,被依赖的排在前面,否则会出现ClassNotFoundException的错误,这里支持觉得路径和相对路径,也支持通配符"*",比如wrapper.java.classpath.1=……/lib/wrapper*,不过这个通配符只能用于匹配文件名,不能用于匹配文件夹名称。
wrapper.java.library.path.1=……/lib:指定Wrapper自带的类库文件存放文件夹,比如Wrapper.DLL文件等,只要指定到对应的上级目录名称就行,支持通配符。
wrapper.java.library.path.1=……/lib:指定Wrapper自带的类库文件存放文件夹,比如Wrapper.DLL文件等,只要指定到对应的上级目录名称就行,支持通配符。
wrapper.app.parameter.1= :指定运行类的main方法参数。
wrapper.daemonize=TRUE:将服务注册成守护线程,就算程序关闭的话不影响服务的运行
wrapper.ntservice.hide-console=false:不显示控制台
wrapper.filter.trigger.1= , wrapper.filter.action.1 :指定过滤器和触发器,可以对控制台的输出信息进行监听,然后触发相应的操作
wrapper.disable_shutdown_hook=TRUE:是否禁用 "关闭Hook" ,关闭的话在出现一般异常的情况下面可以忽略掉异常继续执行
wrapper.console.loglevel=INFO:配置控制台的显示信息的级别,NONE不显示任何输出信息,FATAL只显示致命的错误消息,ERROR显示所有的错误消息,STATUS显示服务状态的改变,包括服务启动和停止等信息,INFO显示所有程序输出的信息和JVM显示的信息,如果程序无法正常启动,可以使用DEBUG显示详细的调试信息。
wrapper.logfile.loglevel=INFO:配置日志记录文件要记录的输出信息的级别,参数值和wrapper.console.loglevel功能一致
wrapper.logfile.maxsize=0:配置日志文件的最大大小,如果为0表示不限制日志文件的大小,支持标记符,“k”代表KB,“m”代表MB,如果要设置最大大小为100KB的话可以这样:wrapper.logfile.maxsize=100k
wrapper.console.title=Wrapper Demo :控制台窗口显示标题,
wrapper.ntservice.name=testwrapper: 系统服务的名称,
wrapper.ntservice.displayname=Wrapper Demo:在服务管理中显示的名称
wrapper.ntservice.description=Wrapper Demo的介绍信息: 在服务管理器显示服务的描述信息
wrapper.ntservice.starttype=AUTO_START: 配置服务启动方式,可以选择AUTO_START(自动)和DEMAND_START(手动)两种方式。默认为自动。
前几天在看Jetty源代码的时候发现它也是使用Wrapper注册成系统服务,使用的是第三种方式,可以参考一下
import java.io.PrintStream;
import org.mortbay.jetty.Server;
import org.mortbay.start.Main;
import org.tanukisoftware.wrapper.WrapperListener;
import org.tanukisoftware.wrapper.WrapperManager;
public class JettyServiceWrapperListener implements WrapperListener {
private static Server __server = null;
public void controlEvent(int event) {
if ((WrapperManager.isControlledByNativeWrapper()) || ((event != 200) && (event != 201) && (event != 203)))
return;
WrapperManager.stop(0);
}
public Integer start(String[] args) {
for (int i = 0; i < args.length; ++i) {
System.out.println("ARG[" + i + "] = " + args[i]);
}
Main.main(args);
return null;
}
public int stop(int code) {
try {
System.out.println("JettyServiceWrapperListener: Stopping Jetty 6 Service!!!");
__server.stop();
System.out.println("JettyServiceWrapperListener: Jetty 6 Service Stopped!!!");
return code;
}
catch (Exception e) {
System.out.println("Stop Server Error");
e.printStackTrace();
}
return -1;
}
public static void setServer(Server server) {
__server = server;
}
public static Server getServer() {
return __server;
}
public static void main(String[] args) {
String[] newStrArgs = new String[args.length + 1];
newStrArgs[0] = System.getProperty("jetty.home") + "etc/jetty-win32-service.xml";
for (int i = 0; i < args.length; ++i) {
newStrArgs[(i + 1)] = args[i];
}
WrapperManager.start(new JettyServiceWrapperListener(), newStrArgs);
}
}
这个类实现了Wrapper的WrapperListener 并实现了它的start和stop方法,start方法在服务器启动的时候调用,不过这里要注意,如果在30秒内你不能执行完start方法,系统会自动放弃这个服务的启动,解决办法可以在start方法使用线程,将比较耗时的操作放在这个线程执行,比如加载Spring文件等。而且如果在start方法执行出现异常,会终止服务的运行。这点要注意。
Stop方法在服务停止启动,start和stop方法的参数可以在wrapper.conf文件里面配置。一般按照这样配置的话你的程序应该可以通过执行StartApp-NT.bat正常启动了。
发表评论
-
Mina重连
2014-05-26 21:29 2859import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6051.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 530一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 731安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1134使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 411ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1082http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 867不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 799http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 459http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 942http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 630http://code.google.com/p/cshbbr ... -
Java内存回收机制
2013-03-13 15:47 777http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 893http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 384http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 487http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 808当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 982目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ... -
Java多线程之消费者生产者模式
2012-07-09 22:27 816/*@author shijin * 生产者与消费者模 ...
相关推荐
对以上配置的服务进行测试,运行InstallMyApp-NT.bat将把你的应用(此处为App)安装到Win32系统服务中了。 打开控制面板-管理程序-服务,看到App已经在系统服务中了,其他用法就与我们熟悉的Windows服务一样了。 ...
一、IIS的添加 请进入“控制面板”,依次选“添加/删除程序→添加/删除Windows组件”,将“Internet信息服务(IIS)”前的小钩去掉(如有),重新勾选中后按提示操作即可完成IIS组件的添加。用这种方法添加的IIS...
插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。 JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。 基于...
在WindowsXP操作系统环境下,应用MySql 数据库以及Java可视化程序设计软件所开发的网上服装店系统。 本系统为人们在网上购买服装提供方便,也给用户提供更为广阔的销售渠道。网上服装店系统从功能上划分成客户端和...
1、将业务层与表示层分离:使用JSP技术,网络开发人员可充分使用HTML来设计页面显示部分(如字体颜色等),并使用JSP指令或者JAVA程序片段来生成网页上的动态内容; 2、能够跨平台:JSP支持绝大部分平台,包括现在...
1、将业务层与表示层分离:使用JSP技术,网络开发人员可充分使用HTML来设计页面显示部分(如字体颜色等),并使用JSP指令或者JAVA程序片段来生成网页上的动态内容; 2、能够跨平台:JSP支持绝大部分平台,包括现在...
打开Windows Server 2000的控制面板,双击ODBC数据源(32位)打开数据源管理,在系统DSN中注册名称为JSP的MS SQL数据源。建立数据源后,JSP程序就可以通过JDBC-ODBC来调用MS SQL数据库。过程如下: 首先,从控制面板...
打开Windows Server 2000的控制面板,双击ODBC数据源(32位)打开数据源管理,在系统DSN中注册名称为JSP的MS SQL数据源。建立数据源后,JSP程序就可以通过JDBC-ODBC来调用MS SQL数据库。过程如下: 首先,从控制面板...
打开Windows Server 2000的控制面板,双击ODBC数据源(32位)打开数据源管理,在系统DSN中注册名称为JSP的MS SQL数据源。建立数据源后,JSP程序就可以通过JDBC-ODBC来调用MS SQL数据库。过程如下: 首先,从控制面板...
RemotelyAnywhere是一个操作简单但功能强大的NT远端管理程序,只要在服务器端安装该软件,那么您在远程客户端只要使用一个支持 Java 的浏览器就可以控制该服务器。现在有了RemotelyAnywhere,即使您人身处国外,也...
§9.8 注册应用程序 109 §9.9 Oracle配置 110 §9.9.1 分布式系统 110 §9.9.2 多层系统 110 §9.9.3 Oracle并行服务器 110 §9.10 Oracle数据库增长的规划 111 §9.10.1 不同增长表的配置 111 §9.10.2 对增长表...
说明 : 一个共享服务器参数, 用于指定已在调度程序上注册, 用来建立数据库连接的唯一服务名。如果要在没有调度程序的情况下仍能连接到数据库, 请将该值设置为与例程名相同。此参数自 8.1.3 版起已废弃。 值范围: ...
短小精干的编辑软件,开发必备。EditPlus 是一个 32 位的功能众多的文字编辑器,适合用来编辑网页与程序的撰写。将常用语法以鲜明色彩强调显示的...最小的系统要求为 Pentium 90 CPU、Windows 95/98/NT、16 MB 内存。
升级加密狗驱动程序,增加了对 Windows 7, Vista 等操作系统的支持。 5. 操作系统界面功能支持库(shell.fne)中的“执行()”命令增加一个参数“窗口显示方式”,作用与核心库“运行()”命令的同名参数一致。 6. ...
摘要 用于制作应用软件的安装程序,支持任何开发平台,灵活性强,性能突出,对JAVA程序的支持也相当完善。 组件列表 技术特性 ♦;;; ;;;通用安装、配置和客户化 ·在终端用户的系统上,将文件和...
如果他不是注册过的成员,此软件 将会调用创建顾客ID页面。如果他是成员而且他想要显示自己以前选择的产品,此软 件将会调用页面来显示顾客的信息和选择的项目。 (3). 对于选择支付和装运方式 我们有三个状态:...
11.3.1 基于NT服务的DCOM服务器——例程DCOMServ 11.3.2 测试服务程序 11.3.3 DCOMCNFG实用程序 11.3.3.1 缺省属性 11.3.3.2 缺省安全性 11.3.3.3 缺省协议 11.3.3.4 应用程序特定设置 11.4 微软事务服务器(MTS) ...
7.3.5 配置NT 4.0系统 61 7.3.6 配置Windows 95或Windows 98 系统 61 7.4 安装WINS服务器 61 7.5 WINS管理和维护 62 7.5.1 加入静态表项 62 7.5.2 维护WINS数据库 63 7.5.3 备份WINS数据库 65 7.5.4 备份WINS注册项...