如何注册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;
}
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权...

Oauth2授权&#xff0c;熟悉微信开发的同学对这个东西应该不陌生吧。当我们的应用系统需要集成第三方授权时一般都会做oauth集成&#xff0c;今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方服务保护我们的API应用。目录&#xff1a;一、通过Dapr…

linux创建备用管理员,sql server 创建备用管理员和只读用户

-----------------------------------------------------------------------创建新的登录名use mastergoexec sp_addlogin loginame mysa , passwd 11goexec sp_addlogin loginame read , passwd 11go--修改密码--exec sp_password old null , new sa , loginame sa--exec…

宝宝学数学的第一套书,秒杀题海战术!上小学前应该这样学数学!

作为一个小学口心算特好、初高中也特别好的学霸。小木一直很关心孩子们的数学问题。我一直都在探索如何引领孩子走进数学的大门&#xff0c;启发他学数学的兴趣&#xff0c;以及把数学思维应用到生活中&#xff0c;而不仅仅是学会背数、四则运算、乘法口诀。孩子大多在3、4岁开…

使用 Azure Container Registry 储存镜像

Azure Container Registry&#xff08;容器注册表&#xff09;是基于 Docker Registry 2.0规范的托管专用 Docker 注册表服务。可以创建和维护 Azure 容器注册表来存储与管理专用的 Docker 容器映像和相关项目。Azure Container Registry 类似与阿里云的容器镜像服务。提供镜像…

在Android应用中使用Pull解析XML文件(传智播客视频笔记)

Service.java源码&#xff1a; package com.sinaapp.ssun.service; import java.io.InputStream; import java.io.OutputStream; import java.util.*; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlSerializer…

linux级别3怎么配置DNS,Linux下DNS服务器配置详解

6)辅助区域的文件基本和主区域的配置一样&#xff0c;就是不再需要在options块中加allow-transfer {}&#xff1b;&#xff0c;编辑named.rfc1912.zones文件&#xff0c;如下图进行添加&#xff1a;一定要将默认的"allow-update {none;}; "项&#xff0c;即将允许更新…

入门机器学习,这一步必不可少!

AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。在机器学习领域&#xff0c;Python已经成为了主流。一方面因为这门语言简单易上手&#x…

有趣的时钟

网址&#xff1a; http://chabudai.org/blog/?p59 转载于:https://blog.51cto.com/zhengchangbai/883557

.NET 中的 Worker Service 入门介绍

翻译自 Steve Gordon 2020年3月30日的文章 《WHAT ARE .NET WORKER SERVICES?》 [1]随着 .NET Core 3.0 的发布&#xff0c;ASP.NET 团队引入了一个新的 Worker Service 项目模板&#xff0c;该模板作为 .NET SDK 的一部分发布。在本文中&#xff0c;我将向您介绍这个新模板&a…

linux实验目的能学会什么意思,Linux实验.doc

Linux实验实验一&#xff1a;Linux系统的安装时间&#xff1a;一、实验目的1&#xff0e;了解Linux操作系统的内核版本和发行版本&#xff1b;2&#xff0e;掌握Fedora、RedHat操作系统的安装方法。二、实验内容和步骤&#xff1a;见教材第二章及相应课件。三、参考内容CD-ROM引…

为什么前后端分离了,你比从前更痛苦?

你有没有遇到过&#xff1a;前端代码刚写完&#xff0c;后端的接口又变了。接口文档永远都是不对的。测试工作永远只能临近上线才能开始。为什么前后端分离了&#xff0c;你比从前更痛苦&#xff1f;前后端分离早已经不是新闻&#xff0c;当真正分离之后确遇到了更多问题。要想…

响应式设计(Response Web Design)浅谈

响应式Web设计&#xff0c;这个话题可能是当下Web设计领域里讨论和应用比较多的话题了&#xff0c;为什么要响应式Web设计?什么是响应式Web设计? Web发展迅速&#xff0c;各种应用和服务层出不穷&#xff0c;现在打开电脑&#xff0c;可能使用最多的程序应该是浏览器了&#…

C# this关键字的3种用法

用法一 this代表当前类的实例对象namespace Demo {public class Test{private string scope "全局变量";public string getResult(){string scope "局部变量";// this代表Test的实例对象// 所以this.scope对应的是全局变量// scope对应的是getResult方法…

c语言哈密顿路径算法,用于检查给定图中是否存在哈密顿循环或路径的C ++程序...

哈密顿循环是哈密顿路径&#xff0c;因此从哈密顿路径的最后一个顶点到第一个顶点有一条边(在图中)。它在无向图中是一条路径&#xff0c;该路径恰好访问该图的每个顶点一次。功能和目的&#xff1a;Begin1.function isSafe() is used to check for whether it is adjacent to …

现在6岁的小朋友都开始学编程了……

前段时间&#xff0c;朋友跟小木说&#xff1a;现在的小孩什么都要学&#xff0c;以后是不是都要学编程了&#xff1f;小木鄙夷地笑了一下&#xff1a;他们已经学编程了啊&#xff01;朋友表情↓↓↓朋友&#xff1a;纳尼&#xff1f;&#xff1f;&#xff1f;我到大学才接触编…

操作分布式文件之三:如何访问和操作远程文件

FttpAdapter fa new FttpAdapter("fttp://10.232.20.151/home/qianfeng.py/fttp/tmp/1.log"); 上面实例化一个FttpAdapter类&#xff0c;并输入一个fttp路径&#xff0c;可以是一个目录路径&#xff0c;也可以是个文件路径 FttpAdapter类提供了一系列访问远程文件的…

记一次 .NET 医院CIS系统 内存溢出分析

一&#xff1a;背景 1. 讲故事前几天有位朋友加wx求助说他的程序最近总是出现内存溢出&#xff0c;很崩溃&#xff0c;如下图&#xff1a;和这位朋友聊下来&#xff0c;发现他也是搞医疗的&#xff0c;哈哈&#xff0c;.NET 在医疗方面还是很有市场的????????????&…

android.mk ndk编译选项优化,Android NDK 编译脚本分析 之一

版权信息&#xff1a;本文为本人原创&#xff0c;欢迎转载&#xff0c;但请著明出处&#xff0c;并保留本版权信息。Android NDK编译脚本编写起来还是是比较简单条理的&#xff0c;然而它的语法和传统的linux GNU Make编译脚本的编写似乎有很大的不同&#xff0c;这让习惯了GNU…

丘成桐:完全不懂数学,才会有“数学无用”的说法

全世界有3.14 % 的人已经关注了数据与算法之美▲中国科学院院长白春礼&#xff08;右&#xff09;与数学家丘成桐&#xff08;左&#xff09;为晨兴数学金奖获得者李思&#xff08;中&#xff09;颁奖培养第一流的学生&#xff0c;首先要有对于学问的兴趣&#xff0c;而非奔着考…

Hadoop 2.0.0-alpha尝鲜安装和hello world

仅供测试学习的文章&#xff0c;不推荐在生产环境使用2.0&#xff0c;因为2.0采用YARN&#xff0c;hive&#xff0c;hbase&#xff0c;mahout等需要map/reduceV1的可能无法使用hadoop 2.0或者会出现意外情况。5月23日&#xff0c;apache发布了hadoop 2.0的测试版。正好跟家呆着…