Я сейчас тщательно протестировал и готов опубликовать свои результаты вместе с двумя различными «решениями», которые я сделал.
Во-первых, позвольте мне немного объяснить мою заявку. Это корпоративное приложение, которое появилось 13 лет назад и с тех пор расширяется.
Следовательно, это приложение большого размера, выполняет много разных задач (хотя большинство пользователей использует только его часть) и имеет около 120 jar-файлов в своем classpath, включая все сторонние jar-файлы.
Как упоминалось ранее, после перезапуска сервера требуется 35 секунд, прежде чем будет показан мой первый логин-JFrame.
Решение 1:
Это было мое первое решение, и это не решение для медленного запуска, а скорее решение для пользователя, не запускающего несколько экземпляров приложения.
Я заметил, что хотя мое приложение было очень медленным при первом начальном запуске, другие приложения не были.
Поэтому обходным путем было создание небольшого автономного приложения для отображения заставки, которое я запускаю в своей программе следующим образом:
splashProcess = Runtime.getRuntime().exec("javaw -jar splash.jar");
Позже я просто убью его с помощью
splashProcess.destroy();
Обратите внимание, что если мне нужно создать заставку с новым JFrame (), то для его отображения потребуется 35 секунд.
Решение 2:
Во время тестирования я обнаружил, что могу смоделировать перезапуск, просто удалив все jar-файлы и скопировав их обратно.
В дополнение к сокращению времени тестирования я обнаружил, что запуск приложения только с 4-5 jar-файлами, необходимыми для первоначального запуска, был очень быстрым (хотя это привело бы к исключениям ClassNotFoundException позже),
это также означает, что я мог попытаться выяснить, какой jar-файл привел к зависанию, начав с копирования всех jar-файлов обратно, а затем пропустив один и еще один.
Однако я узнал, что виноват был не один файл jar. Количество секунд, необходимое для запуска приложения, постепенно уменьшалось при каждом удалении некоторых jar-файлов.
Таким образом, кажется, что проблема заключается в том, что при первом вызове new JFrame () в моем приложении java, похоже, создает какой-то индекс или что-то вроде всех классов в classpath, хотя они не используются в настоящее время.
Я не знаю, почему это происходит, но этот процесс занимает довольно много времени с 120 jar-файлами на пути к классам.
Это привело меня к решению № 2. Когда мое приложение теперь запускается, я проверяю аргумент «startSilent».
Если это присутствует, единственное, что делает мое приложение, это показывает новый JDialog с размером 0,0, а затем вызывает System.exit (0);
Затем я создал скрипт, который запускает мое приложение с параметром «startSilent», который запускается при входе пользователя в систему.
Теперь, если пользователь входит на сервер и ждет, по крайней мере, 35 секунд, прежде чем запускать наше приложение, запуск теперь происходит молниеносно, так как приложение уже запустилось и закрылось один раз, так что «classpath-index» или что-то еще был построен.
Если пользователь запускает приложение через более короткое время, время запуска уменьшается за счет того, как долго беззвучный сценарий уже запущен.
(И запуск всегда будет, по крайней мере, на несколько порядков быстрее, чем раньше, поскольку сценарий запускается до того, как рабочий стол будет готов).
Итак, это результаты моих открытий. Я надеюсь, что другие найдут их полезными, и если кто-то может объяснить, почему то, что я называю «индекс-пути к классам», создано как есть, я был бы рад.