JAR-файл иногда не запускается с сетевого ресурса - PullRequest
0 голосов
/ 20 марта 2019

У нас есть приложение JavaFX, работающее на Spring Boot (v2).Все больше пользователей запускают его в Windows одновременно из общей сетевой папки (с помощью пакета внутри команды java -jar).Jar создается плагином Spring Boot Gradle и работает на Oracle JRE 1.8.

Он работает правильно месяцами, но в настоящее время иногда не запускается с сообщением об ошибке Error: invalid or corrupted jar file.(Файл манифеста правильный.) Обычно это происходит, когда:

  • Пользователь заблокировал свой ПК при запуске приложения.После того, как другой пользователь войдет в систему и попытается запустить тот же банку.Это происходит только на том ПК, который запускает jar в заблокированном сеансе пользователя.Это произошло на нескольких компьютерах, а не только на одном.
  • И мы получили сообщение об ошибке: приложение выбросило NoClassDefFoundError, но класс находится внутри фляги.Я думаю, что эти ошибки имеют отношение.

Мы выпускаем периодически через одну или две недели, и ошибка возникает в нескольких версиях.

Я много копал, чтобы найти решение или подробныйописание этой ошибки, но я ничего не нашел.

У вас есть идеи?

PS: Мы используем этот фрагмент кода, чтобы определить, какая версия jar работает:

        String manifestPath = classPath.substring(0, classPath.indexOf("!") + 1) +
                "/META-INF/MANIFEST.MF";
        Manifest manifest;
        manifest = new Manifest(new URL(manifestPath).openStream());
        return "v" + manifest.getMainAttributes().getValue("Manifest-Version");

Мы начали использовать этот код рядом с сообщением об ошибке.Работает только при запуске.Я вижу, что поток не закрыт вручную или блок попытки с ресурсом.Может ли это вызвать такое поведение?Я думаю, что не потому, что GC будет распоряжаться потоком с неопределенной задержкой, а между запуском двух приложений оценивается больше часов.И это не связано с NoClassDefFoundError.

1 Ответ

0 голосов
/ 20 марта 2019

Он не работает надежно, потому что это очень небезопасный и ненадежный способ запуска приложения. Исполняемый код должен быть локально на машине, выполняющей его.

Таким образом, если по какой-то причине он должен находиться на сетевом диске, его следует скопировать на сервер, который будет выполнять его, а затем выполнить там.

Поскольку это звучит почти так, как будто вы делаете какой-то процесс сборки, было бы гораздо лучше использовать для этого реальный инструмент сборки, такой как Jenkins.

В списке ошибок, которые могут произойти при выполнении из общей сетевой папки:

o Более чем один пользователь может попытаться выполнить его одновременно, что приведет к конфликтам.

o Какой протокол обмена файлами мог блокировать файл (-ы), когда тот просматривал файл или выбрал его в своей программе просмотра сети

o Разные пользователи с разными разрешениями будут вести себя по-разному. Если он пытается просмотреть диск или файлы конфигурации, или записать файл (ы) журнала и т. Д., Некоторые разрешения пользователей для этого общего файлового ресурса могут не иметь необходимого доступа.

o Сетевые общие файловые ресурсы по своей природе ненадежны, что приводит к тому, что файл недоступен случайным образом или случайно сообщается о повреждении.

o Разные пользователи на разных машинах с разными версиями сетевых протоколов будут вести себя по-разному.

o Различные протоколы общего доступа по-разному обрабатывают проверку целостности данных и приводят к разным результатам.

И это может продолжаться довольно долго. Вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...