У меня была задача создать новую версию нашего программного обеспечения для нового клиента, и мне нужно, чтобы приложение работало так, чтобы изначально запущенное приложение запускало другое и оставалось открытым сзади. На данный момент оригинал закрывается при запуске нового. Оригинальное приложение является своего рода загрузчиком, его цель - загрузить другие приложения с сервера и запустить одно из них. Вот почему используется FileLock, и это, вероятно, причина, по которой я не могу понять, как сохранить оригинал открытым сзади и успешно открыть новый. Мне удалось заставить это работать в Linux, но, к сожалению, наш клиент использует Windows 10 ...
Некоторые переменные:
private final List<FileLock> locks = new ArrayList<FileLock>();
private final File applicationPath;
private final String application;
Конструктор загрузчика
public Loader(String[] args) throws IOException {
this.args = args;
applicationPath = new File(THIS_DIRECTORY, application + ".jar");
tryLock("loader");
tryLock(application);
}
load () вызывается в main после того, как конструктор сделан, ничего особенного там нет.
private void load() throws Exception
checkAndDownloadUpdate(application, applicationPath);
String javaBin = getJavaBinary();
List<String> command = new ArrayList<String>();
command.addAll(Arrays.asList(javaBin, THIS_FILE.getAbsolutePath(), "-jar", applicationPath.getAbsolutePath()));
command.addAll(Arrays.asList(args));
new ProcessBuilder(command).start();
}
TryLock:
private void tryLock(String name) {
File path = new File(THIS_DIRECTORY, name + "_lock");
long waitUntil = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10);
while (System.currentTimeMillis() < waitUntil) {
try {
FileLock fileLock = tryLock(path);
if (fileLock != null) {
locks.add(fileLock);
return;
}
}
}
В Linux я смог заставить приложение работать так, как я хотел, заменив содержимое tryLock () просто на return и добавив waitFor () в команду Processbuilder. В Windows новое приложение не запускается, пока не будет убито первое.
Проблема возникает при запуске нового процесса, в Windows 10 Java вызывает метод Unsafe.park () и останавливается до закрытия исходного процесса.