思诚科技 seecen LOGO
咨询热线:0791-87557233
  首页 |   Java EE  
关于思诚
关注官方微信

将Java程序变成Windows系统服务

来源:网络    更新时间:2014-12-3



  近买了一台机器做个source服务器和异地的几个朋友一起做点东西玩玩。但是由于用的是电信的ADSL,所以地址是动态的,每天机器自动重起的时候就会变化。于是我就用3322的域名绑定,但是3322提供的Windows更新dns的客户端运行时不是作为系统服务运行的,所以没有用户登录时它是没有运行的,所以还是没有解决问题。后来下了一个WindowsResourceKitTools(这个工具windowsserver默认是没有的,需要到微软的网站上下载,具体地址我没有记住,google一下肯定能找到),里面有一些工具可以把普通的win32程序变成系统服务。

  instsrv:这个工具是把win32程序变成系统服务,但是并不是所有程序都适合做系统服务的,如CN99的客户端,注册成系统服务后就是无法启动的。

  基本用法:instsrv[服务名][应用程序绝对路径]

  srvany:这个工具就是用来解决上面的工具中的问题,你注册的时候把它当作你要的服务,在用它来启动你的应用程序。

  instsrv[服务名][srvany的绝对路径]

  注册成功后,到服务管理器中把刚才注册的服务打开,在启动参数中填上你的应用程序绝对路径,启动服务就可以了。

  这种方式可以解决更新域名地址的问题了。

  但是心里不爽,作为一个程序员如此受制于人总是不爽的,其实CN99的动态域名更新协议很简单,编个简单的程序就实现的。无奈只会Java,对于C或C 程序员来说,做一个系统服务实在是小Case啊,后悔当初没有好好学C和C 。但是难道就没有办法把Java程序变成windows系统服务吗?在Java的世界里基本上是没有不可能的事,ObjectWebForge上有个项目叫JavaService就是用来把Java程序注册成系统服务的。于是下来看了一下:

  一试--失败

  二试--不成功

  三试--...

  ...
  ...

  放弃!

  老子自己做了,其实有了上面的instsrv和srvany其实就差一个可执行文件了。于是我用JBuilder把我的jar包做成了一个假的exe文件。

  我的DNS更新程序如下:

packageorg.mstar.dns;

importjava.util.TimerTask;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.methods.GetMethod;
importorg.apache.commons.httpclient.HttpStatus;
importorg.apache.commons.httpclient.HttpException;
importjava.io.IOException;
importjava.util.*;
importorg.apache.commons.logging.*;
importorg.apache.commons.httpclient.Credentials;
importorg.apache.commons.httpclient.UsernamePasswordCredentials;
importorg.apache.commons.httpclient.auth.AuthScope;
importjava.text.SimpleDateFormat;

publicclassRefresher{
 privatestaticLogLOG=LogFactory.getLog(Refresher.class);
 publicRefresher(){
  Timertimer=newTimer();
  timer.schedule(newRefreshTask(),0,60000);
 }

 classRefreshTaskextendsTimerTask{
  staticfinalStringURL="http://members.3322.org/dyndns/update?system=dyndns&hostname=zjumty.3322.org";

  publicvoidrun(){
   HttpClientclient=newHttpClient();
   client.getParams().setAuthenticationPreemptive(true);
   Credentialsdefaultcreds=newUsernamePasswordCredentials("username","password");
   //此处我要保密
   client.getState().setCredentials(newAuthScope("members.3322.org",
     80,AuthScope.ANY_REALM),defaultcreds);
   GetMethodmethod=newGetMethod(URL);
   try{
    intstatusCode=client.executeMethod(method);

  • 上一篇文章:

  • 下一篇文章:
  •  

    0791-87557233

    重视每个来电 珍惜您的时间
    思诚者开发沙龙
    江西思诚科技有限公司  赣ICP备17006097号  CopyRight©2014 - 2018