博客首页 注册 建议与交流 排行榜 加入友情链接         宝宝相册的专门空间
推荐 投诉 搜索: 帮助

program-life

所有的一切都要靠我自的努力去获得,这样我才能抬起头来做人...... 别人的永远不会是我的......
myprogramlife.cublog.cn


把Java程序安装为Windows 系统服务的完整例子
首先我们写一下小程序:
  1. package com.main;
  2. import org.apache.log4j.Logger;
  3. public class Start {
  4.     private static Thread thread=null;
  5.     private static Logger logger=Logger.getLogger(Start.class);
  6.     /**
  7.      * 退出方法(在批处理文件中要用到这个方法名,这个方法必须有 String [] args)
  8.      * @param args
  9.      */
  10.     public static void systemExit(String [] args){
  11.         System.out.println("System exit.");
  12.         thread.interrupt();
  13.         logger.info("System exit.");
  14.     }
  15.     /**程序入口
  16.      * @param args
  17.      */
  18.     public static void main(String[] args) {
  19.         System.out.println("Start");
  20. //为了不让服务自动退出,我们写一个小线程,在这里一直跑着
  21.         thread=new Thread(new Service());
  22.         thread.start();
  23.         logger.info("Thread Start.");
  24.     }
  25. }
  26. class Service implements Runnable{
  27.     private static Logger logger=Logger.getLogger(Service.class);
  28.     @Override
  29.     public void run() {
  30.         while(true){
  31.             System.out.println("running....");
  32.             logger.info("running....");
  33.             try {
  34.                 Thread.sleep(10*60*1000);
  35.             } catch (InterruptedException e) {
  36.                 e.printStackTrace();
  37.             }
  38.         }            
  39.     }        
  40. }


以下是安装服务的批处理文件内容:

@echo off
rem 可以在这里指定JAVA_HOME,如:set JAVA_HOME="D:\Program Files\Java\jdk1.6.0"
if "%JAVA_HOME%" == "" goto ERROR

rem 设置服务名
set SERVICE_NAME=JavaServices
rem 设置启动类
set STRAT_CLASS=com.main.Start
rem 设置日志路径
set LOG_PATH=%CD%\logs
rem 设置JMX,如果不启用JMX,可以直接设置为 set JMX_SETTING=""
set JMX_SETTING="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

setlocal EnableDelayedExpansion

rem 指定主类的classpath
set CLASSPATH=.;./bin
rem 通过for循环lib目录下的所有jar及zip文件名来组成classpath
for /F %%a in ('dir lib\*.jar lib\*.zip /b') do set CLASSPATH=!CLASSPATH!;lib\%%a 

echo "JAVA_HOME:%JAVA_HOME%"
echo "服务名:%SERVICE_NAME%"
echo "CLASSPATH:%CLASSPATH%"
echo "日志路径:%LOG_PATH%"
rem 停止服务
net stop %SERVICE_NAME%
rem 卸载服务
JavaServices.exe -uninstall %SERVICE_NAME%
@pause
rem 如果日志的路径不存在,则创建日志
if not exist "%LOG_PATH%" mkdir "%LOG_PATH%"
rem 安装服务
JavaServices.exe -install %SERVICE_NAME% "%JAVA_HOME%\jre\bin\server\jvm.dll" "%JMX_SETTING%" -Dserver -Xms256m -Xmx512m -XX:SurvivorRatio=4 -XX:+UseParallelGC  -Djava.class.path=%CLASSPATH% -start %STRAT_CLASS% -method 

main

 -params service -stop %STRAT_CLASS% -method 

systemExit

 -out "%LOG_PATH%\out.log" -err "%LOG_PATH%\err.log" -current "%CD%" -auto
rem 启动服务
net start %SERVICE_NAME%
@pause
goto END

:ERROR
echo "系统中没有设置JAVA_HOME,请在环境变量中设置JAVA_HOME或者在这个文件的开头部份设置......................"
goto END

:END

以下是完整的例子:
附件:WinServices.rar(369K) 

 原文地址 http://www.javaresearch.org/article/94665.htm
发表于: 2008-04-03 ,修改于: 2008-04-03 18:33,已浏览340次,有评论0条 推荐 投诉


网友评论

发表评论