Я наконец выяснил причину проблемы root: это было связано с правами доступа к файлу, но не с файлом, в сообщении об ошибке упоминается !
То, как я был распаковка нового обновления приложения осуществлялась путем написания простой "unzipper" в Java со следующей базовой реализацией c:
try (var zip = new ZipInputStream(
new BufferedInputStream(
new FileInputStream(newVersionZipFile), 4096))) {
var zipEntry = zip.getNextEntry();
if (zipEntry == null) {
throw new IllegalStateException("Expected at least one entry in the zip file: " + newVersionZipFile);
}
var topEntryName = zipEntry.getName();
zipEntry = zip.getNextEntry();
while (zipEntry != null) {
var file = fileFor(zipEntry, destinationDir, topEntryName);
if (isDirectory(zipEntry)) {
var ok = file.mkdir();
if (!ok) throw new IllegalStateException("Cannot create new directory: " + file);
} else {
Files.copy(zip, file.toPath());
}
zipEntry = zip.getNextEntry();
}
}
Это на самом деле работает, в основном, но имеет большую проблему: оно не учитывает файловые права. Я заметил проблему и сделал все в каталоге bin
исполняемым после распаковки, но я не ожидал, что в минимальной JVM будет больше исполняемых файлов, созданных jlink. И поскольку приложение на самом деле в основном работало, это заставило меня думать, что все в порядке!
Используя команду tree
, я посмотрел на дерево каталогов после распаковки его с помощью Linux s unzip
и мой кастом Java распаковать. Я заметил, что с unzip
, кроме файлов в каталоге bin
, следующие файлы также имели разрешение на выполнение:
├── [drwxrwxr-x] lib
│ ├── [-rw-rw-r--] classlist
│ ├── [-rw-rw-r--] javafx.properties
│ ├── [-rw-rw-r--] javafx-swt.jar
│ ├── [-rwxrwxr-x] jexec
│ ├── [-rw-rw-r--] jrt-fs.jar
│ ├── [-rwxrwxr-x] jspawnhelper
...
В отличие от этого, дерево, разархивированное с помощью Java unzipper, выглядело как this:
├── [drwxrwxr-x] lib
│ ├── [-rw-rw-r--] classlist
│ ├── [-rw-rw-r--] javafx.properties
│ ├── [-rw-rw-r--] javafx-swt.jar
│ ├── [-rw-rw-r--] jexec
│ ├── [-rw-rw-r--] jrt-fs.jar
│ ├── [-rw-rw-r--] jspawnhelper
...
Заметил, что два файла должны иметь разрешение на выполнение: jexec
и jspawnhelper
, оба из которых имеют имена, которые явно указывают на то, что они как-то связаны с выполнением других процессов: D
Чтобы проверить эту гипотезу, я заставил расстегнуть молнию и изменить разрешения этих двух файлов на исполняемые, и теперь все работает как положено!
Теперь моя задача заключается в том, как на самом деле сохранить права доступа к файлам. всех файлов при разархивировании, и это еще одна кроличья нора, поскольку нет стандартного способа получить права доступа к файлам из стандартного почтового индекса (именно поэтому API Java для почтовых индексов не имеет этой функции). Существуют внешние библиотеки, которые в основном работают, поэтому я, вероятно, в конечном итоге буду использовать одну из них ... но это еще одна топика c.