如何注册java程序为windows服务
如何注册java 程序为windows 服务
最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件。由于我想编写的关机程序是运行在别人机器上,只能让该机器在晚上17 点到23 点25 分才上网,到了23 点25 分就可以自动关机。为了让别人感觉不到这个软件的“存在”(免得使用者自己关闭定时关机软件),所以我想把关机软件注册为服务的方式,运行在后台。这里介绍下如何利用javaService 软件把java 程序注册为windows 服务。
一、 利用javaService 注册java 程序为windows 服务
[1] 下载javaService
访问网址http://javaservice.objectweb.org/ 下载windows 版本的javaService 文件,我下载的是JavaService-2.0.10.rar ,目前最新的版本就是“2.0.10 ”。
[2] 安装javaService
解压我们下载下来的javaServices 到一个目录,我是解压到目录“D:/software/JavaService-2.0.10 ”下(解压到任何目录都可以,最好别解压到中文目录,省的出现问题 )
[3] 编写定时关机代码,见第二章的定时关机代码
1) 具体代码参加第二章,类的名字为:
com.test.timer.TimerShutDownWindows
2) 把编写后的java 文件导出为class 的形式,把导出的类放到目录“D:/software/JavaService-2.0.10/classes/com/test/timer ”下。也就是把导出的com 包放到
“D:/software/JavaService-2.0.10/classes” 目录下。
[4] 注册java 程序为windows 服务
进入“D:/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 ”参数后边是要启动的类名,“Djava.class.path ”后面参数中的
“D:/software/JavaService-2.0.10/classe ”地址是我的“TimerShutDownWindows ”类存放的路径,实际应用中修改为自己的classPath 即可。
这里需要注意几点:
1) “%JAVA_HOME% ”jdk 目录,如果没有配置jdk 目录,则替换为jdk 的实际绝对地址。
2) -Djava.class.path 是必须的,因为服务启动的时候无法访问系统的CLASSPATH 变量,所以必须在这里声明;如果jar 比较多,为避免写的命令过长,我们可以使用“-Djava.ext.dirs=jars 所在目录”参数。
3) 服务添加之后,可以在命令行中敲入“services.msc ”命令来查看所有服务,并可以对服务的启动类型(自动启动还是手动启动等)进行修改。
[5] 测试
1) 启动服务
当我们注册完服务后,我们可以通过命令“net start MyShutDownService ”来启动该服务,服务启动后会在D 盘根目录生成my_shutdown.log 日志文件。
2) 关闭服务
如果我们要关闭服务,可以通过命令“net stop MyShutDownService ”来关闭该服务。
3) 删除服务
当我们想删除该服务时,可以使用命令“sc delete MyShutDownService ”来删除该服务。
二、 定时关机代码
|
package com.test.timer; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class TimerShutDownWindows { /* 检测是否需要关机的时间间隔 */ private static long m_nDetectInterval = 5000; /* 记录上次检测的时间,以毫秒为单位 */ private static long m_lLastMilliSeconds = 0; /* 可以使用电脑的最小小时 */ private static int m_nUsePCMinHour = 17; /* 可以使用电脑的最大小时 */ private static int m_nUseComputerMaxHour = 23; /* 如果分钟超过这个时间,则关机计算机 */ private static int m_nMinutes = 25; /* 记录日志的文件的保存位置 */ private static String m_sLogFile = "D:" + File.separator + "my_shutdown.log"; /* 记录当前系统是否已经启动自动关闭程序 */ private static boolean bHasShutDownPC = false; /** * @param args */ public static void main(String[] args) { // 1. 单独开启一个线程去检测 Thread aThread = new Thread(new TimerDetector()); aThread.start(); } /** * 定义内部类 * * @author Administrator * */ static class TimerDetector implements Runnable { /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { // 1. 获取日志文件 PrintWriter out = null; SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { out = new PrintWriter(new FileWriter(m_sLogFile, true), true); } catch (IOException e1) { out = null; e1.printStackTrace(); } // 2. 记录服务启动时间 appendLog(out, " 服务启动时间:" + df.format(new Date())); while (true) { // 1. 判断当前系统时间是否被修改过 boolean bShoudShutDownPC = validateShoudShutDownPC(out); if (bShoudShutDownPC) { // 验证没通过,强制关机 exectueShutDown(out); } else { bHasShutDownPC = false; } // 2. 当前线程休眠下 try { Thread.sleep(m_nDetectInterval); } catch (InterruptedException e) { appendLog(out, e.getMessage()); } } } /** * 验证当前时间是否是需要关机的时间 * * @return */ private boolean validateShoudShutDownPC(PrintWriter _out) { // 1. 判断是否修改了系统时间 boolean bHasModifySystemTime = detectModifySytemTime(_out); appendLog(_out, "bHasModifySystemTime :" + bHasModifySystemTime); if (bHasModifySystemTime) { return bHasModifySystemTime; } // 2. 没有修改系统时间,则判断当前时间是否超过了指定的时间 boolean bShoudSleep = nowIsSleepTime(); appendLog(_out, "bShoudSleep :" + bShoudSleep); if (bShoudSleep) { return bShoudSleep; } return false; } /** * 判断当前时间是否应该休息的时间 * * @return */ private boolean nowIsSleepTime() { // 1. 获取当前小时和分钟 Calendar aCalendar = Calendar.getInstance(); int nHour = aCalendar.get(Calendar.HOUR_OF_DAY); int nMinute = aCalendar.get(Calendar.MINUTE); // 2. 判断当前小时是否在可以使用PC 的时间内, 最大小时为23 if (nHour < m_nUsePCMinHour) { return true; } // 23 点需要单独判断,超过23 点30 就应该休息 if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) { return true; } // 3. 非休息时间 return false; } /** * 判断是否有人修改了系统时间,如果有人修改了系统时间返回true ,<BR> * 否则返回false * * @return */ private boolean detectModifySytemTime(PrintWriter _out) { // 1. 第一次检测系统时间 if (m_lLastMilliSeconds == 0) { m_lLastMilliSeconds = System.currentTimeMillis(); return false; } // 2. 检测两次时间的差值 long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds; lInteral = Math.abs(lInteral); // 3. 判断两次的时间间隔, 两次结果不一定完全等于m_nDetectInterval ,允许误差为1 分钟 long lMaxInterval = m_nDetectInterval + 60 * 1000; appendLog(_out, "lInteral :::" + lInteral); appendLog(_out, "lMaxInterval :::" + lMaxInterval); if (lInteral > lMaxInterval) { // 有人修改了系统时间,强制关机 return true; } // 4. 只有没人修改时间才记录上次检测时间 m_lLastMilliSeconds = System.currentTimeMillis(); return false; } /** * 在指定的流中写入日志信息 * * @param _outWriter * @param _sAppendContent */ private void appendLog(PrintWriter _outWriter, String _sAppendContent) { if (_outWriter == null) { return; } _outWriter.println(_sAppendContent); } /** * 执行关机命令 */ private void exectueShutDown(PrintWriter _out) { if (bHasShutDownPC) { SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); appendLog(_out, " 系统即将关闭, 当前时间:" + df.format(new Date())); return; } appendLog(_out, " 有人修改了系统时间,系统强制关机!"); // 关机 try { Runtime.getRuntime().exec( "shutdown -s -t 120 -c /" 很晚了,该睡觉了,2 分钟后关闭计算机。/""); } catch (IOException e) { appendLog(_out, e.getMessage()); } bHasShutDownPC = true; } } } |
如何注册java程序为windows服务的更多相关文章
- 把java程序作为windows服务运行
参考: https://www.jianshu.com/p/fc9e4ea61e13 https://blog.csdn.net/qq_28566071/article/details/8088250 ...
- Java Service Wrapper 发布Java程序为Windows服务
下载Windows版本:https://www.krenger.ch/blog/java-service-wrapper-3-5-37-for-windows-x64/ 转自:F:\java\bhGe ...
- 注册nodejs程序为windows服务
转载地址:http://www.grati.org/?p=236 应lemonhall要求,写一篇在windows中部署nodejs程序的文章,并提供了how to node上 “deploying- ...
- 利用JAVA Service Wrapper把JAVA程序做成windows服务
今天做了一个读取数据入库的程序.由于读取的数据每天都更新,于是就想把程序做成一个服务,每天定时执行.研究了一下,发现有几种方式可以做.下面我主要记录一下JAVA Service Wrapper方式. ...
- java程序在windows系统作为服务程序运行
Java程序很多情况下是作为服务程序运行的,在Un*x 平台下可以利用在命令后加“&”把程序作为后台服务运行,但在Windows下看作那个Console窗口在桌面上,你是否一直担心别的同时把你 ...
- 黄聪:使用srvany.exe将任何程序作为Windows服务运行
srvany.exe是什么? srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说sr ...
- 使用srvany.exe将任何程序作为Windows服务运行
使用srvany.exe将任何程序作为Windows服务运行 2011 年 3 月 7 日 !本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使 ...
- paip.注册java程序为LINUX系统服务的总结。
paip.注册java程序为LINUX系统服务的总结. ////////////////实现开机启动. 标准方法是按照/etc/init.d/下面的文件,修改一下:然后chkconfig xxx on ...
- 如何把一个c语言程序做成windows服务开机自启动
原文:如何把一个c语言程序做成windows服务开机自启动 目前写的程序是一个用c语言实现socket侦听的,那么如何把这个程序做成开机自启动呢? 我们是通过vs6.0,编译后生成了.exe文件,然后 ...
随机推荐
- 华丽的使用sublime写lua~ sublime lua相关必装插件推荐~~
缘起 lua脚本语言虽好,代码写得飞快,可是写错了调试起来却很困难,lua使用者经常容易犯得一个错误是--写错变量名了,if end 嵌套太多没匹配~,多打了一个逗号, --假设定义了一个变量 loc ...
- android studio 连接 华为手机真机
1.手机开启开发者模式(Honor V10) 设置->关于手机->连续点击版本号5次就能出现开发者模式->返回上一级出现开发者选项->打开选项(开发者选项,USB调试) 2.a ...
- 关于使用JAVA正则表达式报java.lang.StackOverflowError错误问题
最近在使用hadoop做apache日志分析,发现测试数据没问题,但数据一多就出问题,报 java.lang.StackOverflowError错误,最后定位为正则表达式栈溢出,发现某些行的日志数据 ...
- springBean参数注入的几个方法
1.普通方式注入 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- Java 正则表达式 Pattern & Matcher
通常会有这种需求: 在文档中搜索有规律的字符串,然后进行统计或者替换.Java.util.regex包下的Pattern和Matcher这两个类提供了通过正则表达式来匹配查询,甚至替换的功能.那么我们 ...
- scala学习手记8 - 自适应的默认做法
scala有一些默认做法,会让代码更简洁.更易读写,下面列出了这样几个特性: 1. 支持脚本.scala支持脚本,因此无须将所有的代码都放到类里.如果脚本可以满足需求,就将代码放到一个脚本里,无须再创 ...
- JDK__下载地址
1. http://www.oracle.com/technetwork/java/archive-139210.html ZC: 貌似 从JDK7开始,有for ARM的版本,类似 : “Linux ...
- android传感器使用
android传感器的使用以加速度传感器.方向传感器.磁场.压力.温度.光感.特别的距离传感器为例介绍. 首先所在的类需要implement SensorEventListener.使用传感器分为以下 ...
- ng2 学习笔记(一)
ng2发布了一段时间,最近才开始着手学习一下,ng2可以说变化海是比较大的,现在写一些学习过程中要注意的点,新手可以参考,大神可以指导: 按照文档来吧: 1.快速开始:没什么可说的,直接上git 克隆 ...
- SpannableString实现TextView的链接效果
SpannableString实现TextView的链接效果 一.简介 TextView使用SpannableString设置复合文本TextView通常用来显示普通文本,但是有时候需要对其中某些文本 ...