javawindows服務
① 如何把一個java程序做成Windows服務
1、下載wrapper-windows-x86-32系列的工具包,解壓縮為<wrapper-home>。
2、新建一個目錄,例如:C:\MyServerApp,並在其下面創建五個文件夾
分別為:
bin 可執行程序文件夾
conf 配置文件夾
lib wrapper自身的jar包文件夾
logs 日誌文件夾包
application 新建一個class用於存放應用程序的class文件, 此包下還新建一個lib 用於存放應用程序所需要的 jar包。
3、將<wrapper-home>\src\bin 中的App.bat.in,InstallApp-NT.bat.in,UninstallApp-NT.bat.in等文件
與<wrapper-home>\bin 下的wrapper.exe復制到bin 目錄下,並且將App.bat.in,InstallApp-NT.bat.in,
UninstallApp-NT.bat.in等的後綴.in去掉。
將<wrapper-home>\src\conf 下的wrapper.conf文件和<wrapper-home>\conf 下的wrapper-license復制到conf目錄下,wrapper-license文件一定不能少
將<wrapper-home>\lib 下的wrapper.jar,wrappertest.jar和wrapper.dll文件復制到lib目錄下
最終的包結構可以是這樣子的:
C:\MyServerApp
|-bin
|-App.bat
|-InstallApp-NT.bat
|-UninstallApp-NT.bat
|-wrapper.exe
|-lib
|-wrapper.jar 必須要的
|-wrappertest.jar
|-wrapper.dll
|-conf
|-wrapper.conf
|-wrapper-license
|-logs
|-wrapper.log
|-application
|-lib 應用程序中如果用到了jar包,那麼就復制到此文件夾里
|-class 用來存放應用程序(一般應用程序是有包結構的,就把工程裡面的bin目錄下的.class文件連同包一起拷過來)
4、配置Wrapper工具的wrapper.conf配置文件
配置Java 虛擬機的位置
wrapper.java .command=C:\Program Files\Java \jdk1.6.0_07\bin\java
配置wrapper的主類,如果用他的代理方式,就填org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.java .mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
工具尋找jar包以及應用程序的路徑
wrapper.java .classpath.1=../lib/wrappertest.jar
wrapper.java .classpath.2=../lib/wrapper.jar
wrapper.java .classpath.3=../lib/wrapper.dll
應用程序連同其文件夾一起拷到application文件夾下了,所以路徑只需要指定到../application/
wrapper.java .classpath.4=../application/class
應用程序要用到的所有jar包
wrapper.java .classpath.5=../application/lib/*.jar
wrapper.java .library.path.1=../lib
wrapper.java .additional.1=-Dprograme.name=run.bat
要將哪一個應用程序做成服務,就要把他的主函數所在的類名 寫在這里
wrapper.app.parameter.1=com.luke.service.server.TcpServer
wrapper.console.format=PM
wrapper.console.loglevel=INFO
指定日誌記錄的地方
wrapper.logfile=../logs/wrapper.log
wrapper.logfile.format=LPTM
wrapper.logfile.loglevel=INFO
wrapper.logfile.maxsize=0
wrapper.logfile.maxfiles=0
wrapper.syslog.loglevel=NONE
wrapper.console.title=Wrapper Application
wrapper.ntservice.name=@wrapper @
wrapper.ntservice.displayname=@WrapperApplication @
wrapper.ntservice.description=@WrapperDescription @
wrapper.ntservice.dependency.1=
wrapper.ntservice.starttype=AUTO_START
wrapper.ntservice.interactive=false
5、運行cmd
cd c:\MyServerApp\bin
App.bat測試不會將把你的應用(此處為server)安裝到Win32系統服務中
InstallApp.bat安裝 後才將把你的應用(此處為server)安裝到Win32系統服務中
② 濡備綍娉ㄥ唽java紼嬪簭涓簑indows鏈嶅姟
榪欓噷浠嬬粛涓嬪備綍鍒╃敤javaService 杞浠舵妸java 紼嬪簭娉ㄥ唽涓簑indows 鏈嶅姟銆
涓銆 鍒╃敤javaService 娉ㄥ唽java 紼嬪簭涓簑indows 鏈嶅姟
[1] 涓嬭澆javaService
璁塊棶緗戝潃http://javaservice.objectweb.org/ 涓嬭澆windows 鐗堟湰鐨刯avaService 鏂囦歡錛屾垜涓嬭澆鐨勬槸JavaService-2.0.10.rar 錛岀洰鍓嶆渶鏂扮殑鐗堟湰灝辨槸鈥2.0.10 鈥濄
[2] 瀹夎卝avaService
瑙e帇鎴戜滑涓嬭澆涓嬫潵鐨刯avaServices 鍒頒竴涓鐩褰曪紝鎴戞槸瑙e帇鍒扮洰褰曗淒:/software/JavaService-2.0.10 鈥濅笅錛堣В鍘嬪埌浠諱綍鐩褰曢兘鍙浠ワ紝鏈濂藉埆瑙e帇鍒頒腑鏂囩洰褰曪紝鐪佺殑鍑虹幇闂棰 錛
[3] 緙栧啓瀹氭椂鍏蟲満浠g爜錛岃佺浜岀珷鐨勫畾鏃跺叧鏈轟唬鐮
1) 鍏蜂綋浠g爜鍙傚姞絎浜岀珷錛岀被鐨勫悕瀛椾負錛
com.test.timer.TimerShutDownWindows
2) 鎶婄紪鍐欏悗鐨刯ava 鏂囦歡瀵煎嚭涓篶lass 鐨勫艦寮忥紝鎶婂煎嚭鐨勭被鏀懼埌鐩褰曗淒:/software/JavaService-2.0.10/classes/com/test/timer 鈥濅笅銆備篃灝辨槸鎶婂煎嚭鐨刢om 鍖呮斁鍒
鈥淒:/software/JavaService-2.0.10/classes鈥 鐩褰曚笅銆
[4] 娉ㄥ唽java 紼嬪簭涓簑indows 鏈嶅姟
榪涘叆鈥淒:/software/JavaService-2.0.10 鈥滅洰褰曪紝鎵ц屽備笅鍛戒護錛
JavaService.exe -install MyShutDownService "%JAVA_HOME%"/jre/bin/server/jvm.dll -Djava.class.path="%JAVA_HOME%"/lib/tools.jar;D:/software/JavaService-2.0.10/classes -start com.test.timer.TimerShutDownWindows
鍏朵腑鈥-install 鈥滃悗闈㈢殑鍙傛暟涓烘湇鍔$殑鍚嶇О錛屸-start 鈥濆弬鏁板悗杈規槸瑕佸惎鍔ㄧ殑綾誨悕錛屸淒java.class.path 鈥濆悗闈㈠弬鏁頒腑鐨
鈥淒:/software/JavaService-2.0.10/classe 鈥濆湴鍧鏄鎴戠殑鈥淭imerShutDownWindows 鈥濈被瀛樻斁鐨勮礬寰勶紝瀹為檯搴旂敤涓淇鏀逛負鑷宸辯殑classPath 鍗沖彲銆
榪欓噷闇瑕佹敞鎰忓嚑鐐癸細
1) 鈥%JAVA_HOME% 鈥漥dk 鐩褰曪紝濡傛灉娌℃湁閰嶇疆jdk 鐩褰曪紝鍒欐浛鎹涓簀dk 鐨勫疄闄呯粷瀵瑰湴鍧銆
2) -Djava.class.path 鏄蹇呴』鐨勶紝鍥犱負鏈嶅姟鍚鍔ㄧ殑鏃跺欐棤娉曡塊棶緋葷粺鐨凜LASSPATH 鍙橀噺錛屾墍浠ュ繀欏誨湪榪欓噷澹版槑錛涘傛灉jar 姣旇緝澶氾紝涓洪伩鍏嶅啓鐨勫懡浠よ繃闀匡紝鎴戜滑鍙浠ヤ嬌鐢ㄢ-Djava.ext.dirs=jars 鎵鍦ㄧ洰褰曗濆弬鏁般
3) 鏈嶅姟娣誨姞涔嬪悗錛屽彲浠ュ湪鍛戒護琛屼腑鏁插叆鈥渟ervices.msc 鈥濆懡浠ゆ潵鏌ョ湅鎵鏈夋湇鍔★紝騫跺彲浠ュ規湇鍔$殑鍚鍔ㄧ被鍨嬶紙鑷鍔ㄥ惎鍔ㄨ繕鏄鎵嬪姩鍚鍔ㄧ瓑錛夎繘琛屼慨鏀廣
[5] 嫻嬭瘯
1) 鍚鍔ㄦ湇鍔
褰撴垜浠娉ㄥ唽瀹屾湇鍔″悗錛屾垜浠鍙浠ラ氳繃鍛戒護鈥渘et start MyShutDownService 鈥濇潵鍚鍔ㄨユ湇鍔★紝鏈嶅姟鍚鍔ㄥ悗浼氬湪D 鐩樻牴鐩褰曠敓鎴恗y_shutdown.log 鏃ュ織鏂囦歡銆
2) 鍏抽棴鏈嶅姟
濡傛灉鎴戜滑瑕佸叧闂鏈嶅姟錛屽彲浠ラ氳繃鍛戒護鈥渘et stop MyShutDownService 鈥濇潵鍏抽棴璇ユ湇鍔°
3) 鍒犻櫎鏈嶅姟
褰撴垜浠鎯沖垹闄よユ湇鍔℃椂錛屽彲浠ヤ嬌鐢ㄥ懡浠も渟c delete MyShutDownService 鈥濇潵鍒犻櫎璇ユ湇鍔°
浜屻 瀹氭椂鍏蟲満浠g爜
packagecom.test.timer;
importjava.io.File;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
{
/*媯嫻嬫槸鍚﹂渶瑕佸叧鏈虹殑鏃墮棿闂撮殧*/
privatestaticlongm_nDetectInterval=5000;
/*璁板綍涓婃℃嫻嬬殑鏃墮棿錛屼互姣縐掍負鍗曚綅*/
privatestaticlongm_lLastMilliSeconds=0;
/*鍙浠ヤ嬌鐢ㄧ數鑴戠殑鏈灝忓皬鏃*/
privatestaticintm_nUsePCMinHour=17;
/*鍙浠ヤ嬌鐢ㄧ數鑴戠殑鏈澶у皬鏃*/
privatestaticintm_nUseComputerMaxHour=23;
/*濡傛灉鍒嗛挓瓚呰繃榪欎釜鏃墮棿錛屽垯鍏蟲満璁$畻鏈*/
privatestaticintm_nMinutes=25;
/*璁板綍鏃ュ織鐨勬枃浠剁殑淇濆瓨浣嶇疆*/
privatestaticStringm_sLogFile="D:"+File.separator
+"my_shutdown.log";
/*璁板綍褰撳墠緋葷粺鏄鍚﹀凡緇忓惎鍔ㄨ嚜鍔ㄥ叧闂紼嬪簭*/
=false;
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//1.鍗曠嫭寮鍚涓涓綰跨▼鍘繪嫻
ThreadaThread=newThread(newTimerDetector());
aThread.start();
}
/**
*瀹氫箟鍐呴儴綾
*
*@authorAdministrator
*
*/
{
/*
*(non-Javadoc)
*
*@seejava.lang.Runnable#run()
*/
publicvoidrun(){
//1.鑾峰彇鏃ュ織鏂囦歡
PrintWriterout=null;
SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
try{
out=newPrintWriter(newFileWriter(m_sLogFile,true),true);
}catch(IOExceptione1){
out=null;
e1.printStackTrace();
}
//2.璁板綍鏈嶅姟鍚鍔ㄦ椂闂
appendLog(out,"鏈嶅姟鍚鍔ㄦ椂闂達細"+df.format(newDate()));
while(true){
//1.鍒ゆ柇褰撳墠緋葷粺鏃墮棿鏄鍚﹁淇鏀硅繃
booleanbShoudShutDownPC=validateShoudShutDownPC(out);
if(bShoudShutDownPC){
//楠岃瘉娌¢氳繃錛屽己鍒跺叧鏈
exectueShutDown(out);
}else{
bHasShutDownPC=false;
}
//2.褰撳墠綰跨▼浼戠湢涓
try{
Thread.sleep(m_nDetectInterval);
}catch(InterruptedExceptione){
appendLog(out,e.getMessage());
}
}
}
/**
*楠岃瘉褰撳墠鏃墮棿鏄鍚︽槸闇瑕佸叧鏈虹殑鏃墮棿
*
*@return
*/
(PrintWriter_out){
//1.鍒ゆ柇鏄鍚︿慨鏀逛簡緋葷粺鏃墮棿
booleanbHasModifySystemTime=detectModifySytemTime(_out);
appendLog(_out,"bHasModifySystemTime錛"+bHasModifySystemTime);
if(bHasModifySystemTime){
returnbHasModifySystemTime;
}
//2.娌℃湁淇鏀圭郴緇熸椂闂達紝鍒欏垽鏂褰撳墠鏃墮棿鏄鍚﹁秴榪囦簡鎸囧畾鐨勬椂闂
booleanbShoudSleep=nowIsSleepTime();
appendLog(_out,"bShoudSleep錛"+bShoudSleep);
if(bShoudSleep){
returnbShoudSleep;
}
returnfalse;
}
/**
*鍒ゆ柇褰撳墠鏃墮棿鏄鍚﹀簲璇ヤ紤鎮鐨勬椂闂
*
*@return
*/
privatebooleannowIsSleepTime(){
//1.鑾峰彇褰撳墠灝忔椂鍜屽垎閽
CalendaraCalendar=Calendar.getInstance();
intnHour=aCalendar.get(Calendar.HOUR_OF_DAY);
intnMinute=aCalendar.get(Calendar.MINUTE);
//2.鍒ゆ柇褰撳墠灝忔椂鏄鍚﹀湪鍙浠ヤ嬌鐢≒C鐨勬椂闂村唴,鏈澶у皬鏃朵負23
if(nHour<m_nUsePCMinHour){
returntrue;
}
//23鐐歸渶瑕佸崟鐙鍒ゆ柇錛岃秴榪23鐐30灝卞簲璇ヤ紤鎮
if((nHour>=m_nUseComputerMaxHour)&&(nMinute>=m_nMinutes)){
returntrue;
}
//3.闈炰紤鎮鏃墮棿
returnfalse;
}
/**
*鍒ゆ柇鏄鍚︽湁浜轟慨鏀逛簡緋葷粺鏃墮棿錛屽傛灉鏈変漢淇鏀逛簡緋葷粺鏃墮棿榪斿洖true錛<BR>
*鍚﹀垯榪斿洖false
*
*@return
*/
(PrintWriter_out){
//1.絎涓嬈℃嫻嬬郴緇熸椂闂
if(m_lLastMilliSeconds==0){
m_lLastMilliSeconds=System.currentTimeMillis();
returnfalse;
}
//2.媯嫻嬩袱嬈℃椂闂寸殑宸鍊
longlInteral=System.currentTimeMillis()-m_lLastMilliSeconds;
lInteral=Math.abs(lInteral);
//3.鍒ゆ柇涓ゆ$殑鏃墮棿闂撮殧,涓ゆ$粨鏋滀笉涓瀹氬畬鍏ㄧ瓑浜m_nDetectInterval錛屽厑璁歌宸涓1鍒嗛挓
longlMaxInterval=m_nDetectInterval+60*1000;
appendLog(_out,"lInteral錛::"+lInteral);
appendLog(_out,"lMaxInterval錛::"+lMaxInterval);
if(lInteral>lMaxInterval){
//鏈変漢淇鏀逛簡緋葷粺鏃墮棿錛屽己鍒跺叧鏈
returntrue;
}
//4.鍙鏈夋病浜轟慨鏀規椂闂存墠璁板綍涓婃℃嫻嬫椂闂
m_lLastMilliSeconds=System.currentTimeMillis();
returnfalse;
}
/**
*鍦ㄦ寚瀹氱殑嫻佷腑鍐欏叆鏃ュ織淇℃伅
*
*@param_outWriter
*@param_sAppendContent
*/
privatevoidappendLog(PrintWriter_outWriter,String_sAppendContent){
if(_outWriter==null){
return;
}
_outWriter.println(_sAppendContent);
}
/**
*鎵ц屽叧鏈哄懡浠
*/
privatevoidexectueShutDown(PrintWriter_out){
if(bHasShutDownPC){
SimpleDateFormatdf=newSimpleDateFormat(
"yyyy-MM-ddHH:mm:ss");
appendLog(_out,"緋葷粺鍗沖皢鍏抽棴,褰撳墠鏃墮棿錛"+df.format(newDate()));
return;
}
appendLog(_out,"鏈変漢淇鏀逛簡緋葷粺鏃墮棿錛岀郴緇熷己鍒跺叧鏈猴紒");
//鍏蟲満
try{
Runtime.getRuntime().exec(
"shutdown-s-t120-c/"寰堟櫄浜嗭紝璇ョ潯瑙変簡,2鍒嗛挓鍚庡叧闂璁$畻鏈恆/"");
}catch(IOExceptione){
appendLog(_out,e.getMessage());
}
bHasShutDownPC=true;
}
}
}