В примерах в этой статье описывается, как зарегистрировать Java в качестве служебной программы Windows, а также простой программный код запланированного завершения работы Java, а также поделиться им для справки. Конкретный метод заключается в следующем:
1. Вопрос:
Недавно я хотел найти программное обеспечение для управления временем выключения компьютера и нашел несколько в Интернете. Все они были программными средствами с визуальными интерфейсами, которые могли устанавливать определенное время выключения. Поскольку программа отключения, которую я хочу написать, работает на чужой машине, машина может получить доступ к Интернету только с 17:00 до 23:25 вечера, а автоматически выключиться она может в 23:25. Чтобы другие не почувствовали «существование» этого программного обеспечения (чтобы пользователи не могли сами закрыть программное обеспечение для запланированного завершения работы), я хочу зарегистрировать программное обеспечение для завершения работы как службу и запускать его в фоновом режиме. Ниже приводится введение в использование программного обеспечения javaService для регистрации Java-программы в качестве службы Windows.
2. Способ реализации:
1. Используйте javaService для регистрации Java-программы в качестве службы Windows.
① Загрузите javaService
Посетите URL-адрес http://javaservice.objectweb.org/, чтобы загрузить версию файла javaService для Windows. Я загрузил JavaService-2.0.10.rar. Последняя версия — «2.0.10».
② Установите javaService.
Разархивируйте загруженный нами javaServices в каталог. Я разархивировал его в каталог «D:/software/JavaService-2.0.10» (вы можете разархивировать его в любой каталог. Во избежание проблем лучше не разархивировать его в каталог на китайском языке). )
③ Запишите код запланированного отключения.
1) Имя класса:
com.test.timer.TimerShutDownWindows
2) Экспортируйте записанный Java-файл как класс и поместите экспортированный класс в каталог «D:/software/JavaService-2.0.10/classes/com/test/timer». То есть поместите экспортированный пакет com в каталог «D:/software/JavaService-2.0.10/classes».
④ Чтобы зарегистрировать 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) Каталог jdk «%JAVA_HOME%». Если каталог jdk не настроен, замените его фактическим абсолютным адресом jdk.
2) -Djava.class.path необходим, поскольку системная переменная CLASSPATH недоступна при запуске службы, поэтому ее необходимо объявить здесь, если jar-файлов много, чтобы избежать написания слишком длинных команд, мы можем использовать "-Djava"; . ext.dirs=каталог, в котором расположены jar-файлы».
3) После добавления службы вы можете ввести команду «services.msc» в командной строке, чтобы просмотреть все службы и изменить тип запуска службы (автоматический запуск или запуск вручную и т. д.).
⑤ Тест
1) Запускаем службу
После регистрации службы мы можем запустить ее с помощью команды «net start MyShutDownService». После запуска службы в корневом каталоге диска D будет создан файл журнала my_shutdown.log.
2) Закройте сервис
Если мы хотим закрыть службу, мы можем закрыть ее с помощью команды «net stop MyShutDownService».
3) Удалить сервис
Если мы хотим удалить службу, мы можем использовать команду «sc delete MyShutDownService», чтобы удалить службу.
2. Код планового отключения.
Скопируйте код следующим образом: package com.test.timer;
импортировать java.io.File;
импортировать java.io.FileWriter;
импортировать java.io.IOException;
импортировать java.io.PrintWriter;
импортировать java.text.SimpleDateFormat;
импортировать java.util.Calendar;
импортировать java.util.Date;
общественный класс TimerShutDownWindows {
/* Интервал времени для определения необходимости выключения*/
частный статический длинный m_nDetectInterval = 5000;
/* Записываем время последнего обнаружения в миллисекундах */
частный статический длинный m_lLastMilliSeconds = 0;
/* Минимальное количество часов, в течение которых можно использовать компьютер */
частный статический int m_nUsePCMinHour = 17;
/* Максимальное количество часов, в течение которых можно использовать компьютер */
частный статический int m_nUseComputerMaxHour = 23;
/* Если минуты превышают это время, выключите компьютер */
частный статический int m_nMinutes = 25;
/* Место хранения файла журнала */
частная статическая строка m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* Записываем, запустила ли текущая система программу автоматического выключения*/
частное статическое логическое значение bHasShutDownPC = false;
/**
* @param аргументы
*/
public static void main(String[] args) {
// 1. Запускаем отдельный поток для обнаружения
Поток aThread = новый поток (новый TimerDetector());
aThread.start();
}
/**
* Определить внутренний класс
*
* @author Администратор
*
*/
статический класс TimerDetector реализует Runnable {
/*
* (не Javadoc)
*
* @see java.lang.Runnable#run()
*/
общественный недействительный запуск () {
// 1. Получить файл журнала
PrintWriter out = null;
SimpleDateFormat df = new SimpleDateFormat("гггг-ММ-дд ЧЧ:мм:сс");
пытаться {
out = новый PrintWriter (новый FileWriter (m_sLogFile, true), true);
} поймать (IOException e1) {
выход = ноль;
e1.printStackTrace();
}
// 2. Запись времени запуска службы
AppendLog(out, "Время запуска службы:" + df.format(new Date()));
в то время как (истина) {
// 1. Определить, было ли изменено текущее системное время
логическое значение bShoudShutDownPC = validateShutShutDownPC(out);
если (bShoudShutDownPC) {
// Проверка не удалась, принудительное завершение работы
выполнитьShutDown (выход);
} еще {
бХасШутДаунПК = ложь;
}
// 2. Текущий поток переходит в режим ожидания
пытаться {
Thread.sleep(m_nDetectInterval);
} catch (InterruptedException e) {
appendLog(out, e.getMessage());
}
}
}
/**
* Проверьте, является ли текущее время временем, которое необходимо выключить.
*
* @возвращаться
*/
частное логическое значение validateShutDownPC (PrintWriter _out) {
// 1. Определить, было ли изменено системное время
логическое значение bHasModifySystemTime =DetectModifySytemTime(_out);
AppendLog(_out, "bHasModifySystemTime:" + bHasModifySystemTime);
если (bHasModifySystemTime) {
вернуть bHasModifySystemTime;
}
// 2. Если системное время не было изменено, определяем, превышает ли текущее время указанное время.
логическое значение bShoudSleep = nowIsSleepTime();
AppendLog(_out, "bShoudSleep:" + bShoudSleep);
если (bShoudSleep) {
вернуть бШоудСлип;
}
вернуть ложь;
}
/**
* Определить, должно ли текущее время быть временем отдыха
*
* @возвращаться
*/
частное логическое значение nowIsSleepTime() {
// 1. Получить текущий час и минуту
Календарь aCalendar = Calendar.getInstance();
int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
int nMinute = aCalendar.get(Calendar.MINUTE);
// 2. Определить, находится ли текущий час в пределах времени, когда компьютер можно использовать, максимальный час — 23
если (nHour < m_nUsePCMinHour) {
вернуть истину;
}
// 23 часа нужно оценивать индивидуально, а перерыв делать после 23:30
if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
вернуть истину;
}
// 3. Время без отдыха
вернуть ложь;
}
/**
* Определить, изменил ли кто-то системное время. Если кто-то изменил системное время, верните true, <BR>.
* В противном случае верните false
*
* @возвращаться
*/
частное логическое обнаружениеModifySytemTime (PrintWriter _out) {
// 1. Впервые определяем системное время
если (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = System.currentTimeMillis();
вернуть ложь;
}
// 2. Обнаружить разницу между двумя значениями времени
long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
lИнтерал = Math.abs(lИнтерал);
// 3. Определить временной интервал между двумя значениями. Два результата могут не совпадать с m_nDetectInterval. Допустимая ошибка — 1 минута.
длинный lMaxInterval = m_nDetectInterval + 60 * 1000;
AppendLog(_out, "lInteral:::" + lInteral);
AppendLog(_out, "lMaxInterval:::" + lMaxInterval);
if (lInteral > lMaxInterval) {
// Кто-то изменил системное время и принудительно завершил работу
вернуть истину;
}
// 4. Время последнего обнаружения записывается только в том случае, если никто не изменяет время.
m_lLastMilliSeconds = System.currentTimeMillis();
вернуть ложь;
}
/**
* Запись информации журнала в указанный поток
*
* @param _outWriter
* @param _sAppendContent
*/
частный недействительный AppendLog (PrintWriter _outWriter, String _sAppendContent) {
если (_outWriter == ноль) {
возвращаться;
}
_outWriter.println(_sAppendContent);
}
/**
* Выполнить команду выключения
*/
частный недействительный выполнитьShutDown (PrintWriter _out) {
если (bHasShutDownPC) {
SimpleDateFormat df = новый SimpleDateFormat(
"гггг-ММ-дд ЧЧ:мм:сс");
AppendLog(_out, "Система скоро выключится, текущее время: " + df.format(new Date()));
возвращаться;
}
appendLog(_out, "Кто-то изменил системное время, и система была вынуждена завершить работу!");
// Неисправность
пытаться {
Runtime.getRuntime().exec(
"shutdown -s -t 120 -c /" Уже очень поздно, пора идти спать, выключите компьютер через 2 минуты. /"");
} catch (IOException e) {
appendLog(_out, e.getMessage());
}
бХасШутДаунПК = правда;
}
}
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.