Запуск только одного экземпляра исполняемого файла Jar - PullRequest
2 голосов
/ 21 января 2012

Итак, я упаковал свой проект как один исполняемый файл, который работает нормально. Но иногда случается, что пользователь запускает файл несколько раз, и это приводит к тому, что он запускает несколько экземпляров одного и того же проекта (что приводит к неожиданному поведению, например, перезаписи значений в файлах отложенными экземплярами проекта).

Я хочу знать для платформы Windows (Win7), каковы варианты блокировки выполнения только один раз, а затем, если jar уже запущен, просто не продолжайте выполнять код снова.

Я читал об идентификаторах процессов, но если есть несколько java-приложений, все они в конечном итоге отображают imagename как javaw.exe, и как я могу определить собственный идентификатор процесса ??

Пожалуйста, предложите, как правильно делать это, спасибо !!

Ответы [ 3 ]

3 голосов
/ 21 января 2012

Самое простое решение - использовать фиксированный, неиспользуемый порт.

ServerSocket ss;
try {
    ss = new ServerSocket(MY_PORT);
    // not already running.
} catch (BindException e) {
    // already running.
}
1 голос
/ 21 января 2012

Вы можете открыть ServerSocket на выделенном порту TCP при запуске приложения и закрыть его при завершении работы приложения.

Если экземпляр уже запущен, вы получите «Используемый порт»"исключение.

1 голос
/ 21 января 2012

Исходя из моего опыта, лучший подход, который я использовал, - это создание прослушивающего ServerSocket на конкретном порту (например, 61234).Сокет ничего не делает, но если вам удается его создать, это означает, что никакой другой процесс не был запущен.Дублированные экземпляры исполняемого файла JAR не смогут создать ServerSocket на том же порту, и поэтому они должны выйти.

...