top
Loading...
將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初學者專區
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗