и все равно будет работать нормально но удаляю быстрее

ужен файл JAR, чтобы удалить себя.

Проблема в том, что Windows блокирует файл JAR во время его работы и не может удалить себя напрямую.

Я искал решения, в которых пакетный скрипт может убить процесс JAR, а затем удалить файл, но

System.exit(0) не желательно, потому что он не запускается черезBatch файл.taskkill /F /IM "java.exe" не желательно, потому что это убиваетВСЕ Java процессы.jps не может быть использованпотому что это доступно только вJDK и пользователи могут запуститьJRE так что не получится.

Я застрял в поиске решения, которое позволяет мне найтиPID текущегоJAR с помощьюJava код, затем выписываяBatch команда и вставкаPID который убивает процесс, например как следующее:

printWriter.println("taskkill /PID " + currentJARPID);

Если вам интересно, для чего это нужно, вы можете проверитьэто ответ.

 BullyWiiPlaza30 окт. 2017 г., 16:07
@phflack: я должен убитьJava процесс из пакетного файла, так чтоJAR больше не заблокирован и может быть удален. Удаление не может быть сделано изнутриJava код, поскольку он не может запускаться и удалять себя одновременно из-за блокировки файла наWindows.
 phflack30 окт. 2017 г., 16:09
Я понимаю, что я перефразирую вопрос: может ли процесс Java прочитать вывод .bat
 phflack30 окт. 2017 г., 16:01
Может ли java-файл прочитать выходные данные файла bat, ожидая команды kill? Или вы должны убить файл из файла bat, не взаимодействуя с файлом Java?
 Kevin Boone30 окт. 2017 г., 16:46
Надежно ли работает рассматриваемый вами процесс? Предположительно, это будет работать, если JVM завершит работу - снята блокировка исполняемого файла - быстрее, чем пакетный файл может быть загружен и выполнен. Я допускаю, что все может работать таким образом, но я не понимаю, как это можно гарантировать. Не могли бы вы запустить JVM из пакетного файла, а затем удалить этот файл из JAR после выхода из JVM?

Ответы на вопрос(1)

Решение Вопроса

Вот рабочий пример

public class Delete
{
    public static void main(String[] args) throws Throwable
    {
        System.out.println("Running");

        System.out.println("Deleting");
        Runtime.getRuntime().exec("cmd /c ping localhost -n 6 > nul && del Delete.jar");

        System.out.println("Ending");
        System.exit(0);
    }
}

Главная особенность этогоcmd /c ping localhost -n 6 > nul && del Delete.jar

Удаляет файл jar послежду 5 секунд

Для проверки я использовалjavac Delete.java && jar cfe Delete.jar Delete Delete.class построить банку иjava -jar Delete.jar бежать

Я также подтвердил, что не могу удалить файл JAR во время его выполнения, черезnew File("Delete.jar").delete(); а также с помощью проводника Windows

 phflack01 нояб. 2017 г., 16:26
Также обратите внимание, что файлы .class не имеют проблемы с блокировкой Windows и используютnew File("Delete.class"); работает
 BullyWiiPlaza01 нояб. 2017 г., 16:50
Вы даже можете использовать-n 2 и все равно будет работать нормально но удаляю быстрее

Ваш ответ на вопрос