Делаем Java приложение независимым от установки JRE или переносным (portable)

Одна из основных трудностей распространения Java программ – необходимость наличия на компьютере пользователя среды выполнения Java Runtime Environment (JRE). Именно поэтому переносные (portable) приложения на Java редкость.

В тоже время эту проблему вполне можно разрешить и создать не только переносное, но и «обычное» приложение, которое не будет требовать наличия предустановленной JRE.

Однако, учитывая кроссплатформенность Java, сразу отметим, что в данной статье речь пойдёт о решении данной задачи применительно к среде Windows.

Существует два основных подхода к решению данной задачи.

Способ 1. Преобразование в нативный код

Иначе говоря, преобразование из jar в exe.

Казалось бы, это самый очевидный способ. Но, на самом деле, он самый трудно реализуемый и практически не работоспособный.

Сконвертировать jar в exe в принципе не проблема. В частности, есть масса утилит, которые позволяют это сделать. Однако подавляющее практически все они не избавляют от необходимости устанавливать JRE. Без JRE exe файл, созданный этими утилитами, всё равно не запустится.

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

Способ 2. Использование переносной версии JRE

Этот способ основан на том, что JRE может работать и без установки на компьютер. Достаточно скачать архив с официальной страницы загрузки (ссылка в конце статьи) и распаковать его в любую папку. После этого JRE уже готов к работе.

Однако запустить Java программу в этом случае можно только двумя способами:

  • Из командной строки;
  • С помощью программы загрузчика.

Первый вариант не подходит, так как слишком сложен для рядового пользователя. Остаётся второй.

Принцип работы загрузчика, на самом деле, достаточно прост. Программа передаёт JRE команды необходимые для запуска Java приложения и после этого закрывается. Тем самым автоматизируя процесс запуска, выполняемый в случае командной строки вручную.

Рассмотрим пример написания такого загрузчика на Delphi. Предположим, что загрузчик, jar файл с Java приложением и папка с JRE расположены в одной общей папке.

Определим константы (относительный путь к исполняемому файлу JRE и передаваемые команды (включают относительный путь к файлу Java приложения)).

 

При использовании javaw.exe вместо java.exe приложение вызывается без окна командной строки на заднем плане.

Для запуска передачи команд воспользуемся обычной функцией ShellExecute.

 

Проще всего выполнить загрузчик  в виде консольной программы (пример выше приведён именно для консольного варианта). Однако в этом случае при запуске на заднем плане будет всё равно кратковременно появляться консоль.

Чтобы это устранить, можно создать VCL приложение с невидимой формой и запускать Java приложение в одном из её событий. Например, onShow.

 

После отправки команды на запуск Java приложения форму сразу же закрываем.

Форму делаем невидимой при помощи стандартного приёма.

 

В результате при запуске Java приложения работа загрузчика станет практически не заметна.

Безусловно, данный способ также сопряжён с определёнными издержками.

  • Требуется написание нативной программы загрузчика;
  • Требуется включать в состав программы JRE, которая в распакованном виде занимает порядка 150 МБ.

Но, к сожалению, если необходимо сделать приложение действительно независимым от наличия JRE на компьютере пользователя, альтернативы нет. Это единственный гарантированно работающий способ запустить Java приложения на любом компьютере под управлением операционной системы Windows не устанавливая при этом JRE.

Другое дело, насколько оправданы все эти действия для программы, которая в итоге будет включать минимум полезного функционала и по большей части состоять только из JRE?.. Поэтому вряд ли есть смысл делать Java приложения независимыми от установки JRE  без реальной необходимости.

Ссылки:
  1. Java Runtime Environment (JRE). Официальная страница загрузки

6 комментариев

  1. Форму делаем невидимой при помощи стандартного приёма. Почему сразу не писать код в dpr без использования форм вообще?

    1. Можно писать код и сразу в dpr. Это никто не запрещает. Более того, в данной ситуации, это действительно проще, чем связываться с формами. Всё-таки код представленной в статье программы загрузчика, что называется, проще не придумаешь. Но, вообще, писать прикладной код для exe (если это не консоль) в dpr не желательно.

      1. Некропост но все-же: «Но, вообще, писать прикладной код для exe (если это не консоль) в dpr не желательно.» — почему?

        1. Хотя бы потому, что файлы проекта нужно использовать в соответствии с их назначением, а не так как этого хочется.

  2. А для запуска веб программы со значка в Проводнике, нужен будет JRE? Пользователь щелкает по значку программы в Проводнике Виндовс, и эта java-программа открывается в браузере пользователя, либо из встроенного внутрь в программу своего варианта браузера.

    1. JRE необходим для запуска любой программы на Java. В Вашем случае для работы приложения необходимо также специальное серверное ПО, которое позволяет web приложению на Java выполняться.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *