將Java程序變成Windows系統服務
基本用法:instsrv [服務名] [應用程序絕對路徑]
srvany: 這個工具就是用來解決上面的工具中的問題,你注冊的時候把它當作你要的服務,在用它來啟動你的應用程序。
instsrv [服務名] [srvany的絕對路徑]
注冊成功后,到服務管理器中把剛才注冊的服務打開,在啟動參數中填上你的應用程序絕對路徑,啟動服務就可以了。
這種方式可以解決更新域名地址的問題了。
但是心里不爽,作為一個程序員如此受制于人總是不爽的,其實CN99的動態域名更新協議很簡單,編個簡單的程序就實現的。無奈只會Java,對于C或C++程序員來說,做一個系統服務實在是小Case啊,后悔當初沒有好好學C和C++。但是難道就沒有辦法把Java程序變成windows系統服務嗎?在Java的世界里基本上是沒有不可能的事,ObjectWeb Forge上有個項目叫JavaService就是用來把Java程序注冊成系統服務的。于是下來看了一下:
一試--失敗
二試--不成功
三試--...
...
...
放棄!
老子自己做了,其實有了上面的instsrv和srvany其實就差一個可執行文件了。于是我用JBuilder把我的jar包做成了一個假的exe文件。
我的DNS更新程序如下:
| package org.mstar.dns; import java.util.TimerTask; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.HttpException; import java.io.IOException; import java.util.*; import org.apache.commons.logging.*; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import java.text.SimpleDateFormat; public class Refresher { private static Log LOG = LogFactory.getLog(Refresher.class); public Refresher() { Timer timer = new Timer(); timer.schedule(new RefreshTask(), 0, 60000); } class RefreshTask extends TimerTask { static final String URL ="http://members.3322.org/dyndns/update?system=dyndns&hostname=zjumty.3322.org"; public void run() { HttpClient client = new HttpClient(); client.getParams().setAuthenticationPreemptive(true); Credentials defaultcreds = new UsernamePasswordCredentials("username", "password"); //此處我要保密 client.getState().setCredentials(new AuthScope("members.3322.org", 80, AuthScope.ANY_REALM), defaultcreds); GetMethod method = new GetMethod(URL); try { int statusCode = client.executeMethod(method); if (statusCode != HttpStatus.SC_OK) { LOG.error("Method failed: " + method.getStatusLine()); } Date date = Calendar.getInstance().getTime(); SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); byte[] responseBody = method.getResponseBody(); LOG.info(fmt.format(date) + " -- " + new String(responseBody)); } catch (HttpException e) { LOG.error("Fatal protocol violation: " + e.getMessage()); e.printStackTrace(); } catch (IOException e) { LOG.error("Fatal transport error: " + e.getMessage()); e.printStackTrace(); } finally { method.releaseConnection(); } } } public static void main(String[] args) { Refresher refresher = new Refresher(); } } |
其實就是用Jakarta的HttpClient來請求一個URL就可以了。
于是我現在有了我的Refresher.exe。當然你的系統上一定要有JVM才能運行(廢話)。為了運行方便我是把運行時的jar包,如logger.jar,httpclient.jar等打在我的jar包里了。
接下來就是把它搞成系統服務了。
第一步:instsrv Refrehser C:Program FilesWindows Resource KitsToolssrvany.exe
第二步:regedit打開注冊表
第三步:進入HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRefrehser
第四步:右鍵-新建-項 填入 Parameters
第五步:打開Parameters,右鍵-新建-字符串值 Application
第六步:雙擊Application 填入 c:efresher.exe
弟七步:啟動Refresher服務。
一切都OK了。
在Parameters里還可以添加很多鍵值:
AppDirectory 工作目錄
AppParameters 你的應用程序的參數。(我可以把我上面程序做成可以接受參數的,就更通用了)
AppEnvironment 運行環境變量。
值現在作為Java程序員的你也可以為自己系統添加一些動能了,趕快去做吧!
編輯推薦:Java初學者專區 |