`

将Java程序注册成系统服务(NT服务)

 
阅读更多
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 Service Wrapper配置Java台程序Windows服务

    对以上配置的服务进行测试,运行InstallMyApp-NT.bat将把你的应用(此处为App)安装到Win32系统服务中了。 打开控制面板-管理程序-服务,看到App已经在系统服务中了,其他用法就与我们熟悉的Windows服务一样了。 ...

    IIS6.0 IIS,互联网信息服务

     一、IIS的添加 请进入“控制面板”,依次选“添加/删除程序→添加/删除Windows组件”,将“Internet信息服务(IIS)”前的小钩去掉(如有),重新勾选中后按提示操作即可完成IIS组件的添加。用这种方法添加的IIS...

    在线考试系统文献综述

    插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。 JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。 基于...

    网上服装店设计_毕业论文设计(java)

    在WindowsXP操作系统环境下,应用MySql 数据库以及Java可视化程序设计软件所开发的网上服装店系统。 本系统为人们在网上购买服装提供方便,也给用户提供更为广阔的销售渠道。网上服装店系统从功能上划分成客户端和...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    1、将业务层与表示层分离:使用JSP技术,网络开发人员可充分使用HTML来设计页面显示部分(如字体颜色等),并使用JSP指令或者JAVA程序片段来生成网页上的动态内容; 2、能够跨平台:JSP支持绝大部分平台,包括现在...

    基于J2EE框架的个人博客系统项目毕业设计论...

    1、将业务层与表示层分离:使用JSP技术,网络开发人员可充分使用HTML来设计页面显示部分(如字体颜色等),并使用JSP指令或者JAVA程序片段来生成网页上的动态内容; 2、能够跨平台:JSP支持绝大部分平台,包括现在...

    项目申报系统(jsp+sql2000)

    打开Windows Server 2000的控制面板,双击ODBC数据源(32位)打开数据源管理,在系统DSN中注册名称为JSP的MS SQL数据源。建立数据源后,JSP程序就可以通过JDBC-ODBC来调用MS SQL数据库。过程如下: 首先,从控制面板...

    网络考试系统(jsp+sql2000)

    打开Windows Server 2000的控制面板,双击ODBC数据源(32位)打开数据源管理,在系统DSN中注册名称为JSP的MS SQL数据源。建立数据源后,JSP程序就可以通过JDBC-ODBC来调用MS SQL数据库。过程如下: 首先,从控制面板...

    公司人事管理系统.(jsp+sql2000)

    打开Windows Server 2000的控制面板,双击ODBC数据源(32位)打开数据源管理,在系统DSN中注册名称为JSP的MS SQL数据源。建立数据源后,JSP程序就可以通过JDBC-ODBC来调用MS SQL数据库。过程如下: 首先,从控制面板...

    RemotelyAnywhere V8 服务器版破解补丁

    RemotelyAnywhere是一个操作简单但功能强大的NT远端管理程序,只要在服务器端安装该软件,那么您在远程客户端只要使用一个支持 Java 的浏览器就可以控制该服务器。现在有了RemotelyAnywhere,即使您人身处国外,也...

    ORACLE9i_优化设计与系统调整

    §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 对增长表...

    Oracle9i的init.ora参数中文说明

    说明 : 一个共享服务器参数, 用于指定已在调度程序上注册, 用来建立数据库连接的唯一服务名。如果要在没有调度程序的情况下仍能连接到数据库, 请将该值设置为与例程名相同。此参数自 8.1.3 版起已废弃。 值范围: ...

    EditPlus_3_12英文版+注册码

    短小精干的编辑软件,开发必备。EditPlus 是一个 32 位的功能众多的文字编辑器,适合用来编辑网页与程序的撰写。将常用语法以鲜明色彩强调显示的...最小的系统要求为 Pentium 90 CPU、Windows 95/98/NT、16 MB 内存。

    易语言程序免安装版下载

    升级加密狗驱动程序,增加了对 Windows 7, Vista 等操作系统的支持。 5. 操作系统界面功能支持库(shell.fne)中的“执行()”命令增加一个参数“窗口显示方式”,作用与核心库“运行()”命令的同名参数一致。 6. ...

    InstallAnywhere v5.5.1--专业、强大的安装工具

    摘要 用于制作应用软件的安装程序,支持任何开发平台,灵活性强,性能突出,对JAVA程序的支持也相当完善。 组件列表 技术特性 &#9830;;;;&nbsp;;;;通用安装、配置和客户化 ·在终端用户的系统上,将文件和...

    电子商务管理系统设计方案.doc

    如果他不是注册过的成员,此软件 将会调用创建顾客ID页面。如果他是成员而且他想要显示自己以前选择的产品,此软 件将会调用页面来显示顾客的信息和选择的项目。 (3). 对于选择支付和装运方式 我们有三个状态:...

    Visual C++实践与提高-COM和COM+篇『PDF』

    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) ...

    TCP/IP技术大全(中文PDF非扫描版)

    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注册项...

Global site tag (gtag.js) - Google Analytics