О том, как работать с программами на языке Java.

Кон В. Г.   11-07-2023   http://kohnvict.narod.ru

Годы проходят и компьютеры становятся все мощнее. Если в самом начале нового времени программы сначала компилировались, а потом исполнялись, потому что так было быстрее, то теперь предпочтение отдается программам, которые сразу исполняются, а их текст пишется в простом текстовом редакторе. Отчасти заслуга такого положения еще и в том, что научились программировать. Но наиболее оптимальный режим состоит в том, что программа исполняется сразу, но при необходимости компилируется на лету, то есть в процессе исполнения. Такая программа и работает быстро и кода надо писать меньше. Самым первым языком программирования, который работает в такой манере и широко распространился, является как раз Java.

Но исполняемую программу кто-то должен исполнять. И вот этот исполнитель уже написан в коде компьютера, один для всех. В технологии Java такая программа называется JRE (Java Runtime Environment). А сам код на языке Java тоже не остается текстом. Специальная программа сначала проверяет его на ошибки, а затем записывает в компактном виде, который называют байт-кодом. Но сам компьютер такую запись не понимает. Ее понимает только JRE. Однако важно, что JRE ее наверняка выполнит, потому что ошибок больше нет, по крайней мере грамматических.

Бывают еще ошибки невозможности выполнения, например, деления на 0, или отсутствия файла, который нужен. В этом случае в языке есть возможность обработки этих ошибок и можно либо обойти операцию, либо написать информацию, либо как-то исправить. Сам программист решает как быть. С другой стороны, Java -- это полноценный язык программирования, который, с одной стороны, универсален и не зависит от операционной системы, а с другой -- позволяет делать на компьютере почти все, что можно делать, за исключением супер опасных операций и запрещенного доступа.

Язык хорошо продуман, но есть и недостатки. Код слишком сложный для начинающих. Это раз. И многие команды пишутся очень длинными словами. То есть если печатать самому, то надо очень много букв писать, много раз стучать по клавиатуре. Это два. Второй недостаток пытаются ликвидировать используя среды разработки, которые как бы подсказывают что и когда писать и сами пишут после выбора. Но эти среды -- это снова огромные и не простые программы, и не всем они подходят. Лично я пошел по другому пути и просто на этом языке написал интерпретатор другого языка, в котором нет указанных недостатков. Все очень просто и пишется коротко.

Получился двойной интерпретатор. Первый интерпретатор запускает Java код, который исполняется вторым интерпретатором, то есть JRE. И для работы моей программы JRE необходима. Вот о том как работать с JRE я и расскажу в этой статье. Есть два способа: стандартный и нестандартный. Про первый способ написано много и всюду. Про второй не написано нигде и его не рекомендуют. Но иногда он необходим. Первый способ состоит в том, что в системе Виндовс надо установить JRE по дистрибутиву, который можно скачать на сайте владельца продуктом. Сейчас это фирма Oracle, а первоначально была фирма Sun Microsystems. Адрес я даже давать не буду. Достаточно в любом поисковике набрать Java и вам дадут правильный адрес. Иногда они меняются. И там все написано.

Такой способ хорош, если у вас очень много программ, написанных на Java. Один раз установили JRE и система Виндовс запускает файлы с расширением jar как исполняемые программы, и не надо ни о чем заботиться. Время от времени вам будут предлагать обновить версию на новую, еще более навороченную и безопасную. Удобство в том, что сама программа JRE содержит много готового кода и его можно использовать. При этом JRE растет, а программисту писать надо все меньше. Но зато надо изучать что там еще наделали. Но если у вас только одна программа написана на Java и другие вам не нужны, то польза от установки JRE уже не такая и большая. А есть и минусы. Вам хочется запускать программу на любом компьютере, в том числе и на чужом, а без установки JRE это не получится.

Не получится по стандартному способу. Но есть нестандартный способ. Дело в том, что хотя Java работает в трех системах (Виндовс, Юникс, Яблоко), но первоначально она создавалась для Юникс. А в этой системе все делается через командную строку. В системе Виндовс тоже был такой режим в самом начале -- операционная система понимала только команды и называлась ДОС. И вот эти команды существуют в любой версии Виндовс и только увеличиваются в числе. Работают все старые команды ДОС и плюс новые команды. И любую программу можно запускать, записав команду в окне терминала. А можно записать текстовый файл с командами, сделать ему расширение .bat и система Виндовс будет исполнять команды этого файла, считывая их из текста.

Можно еще записать расширение .cmd. Расширение .bat было в ДОС с самого начала, и я привык использовать его. Я работал в системе ДОС с самого начал и до конца, а командами ДОС и сейчас пользуюсь постоянно. Рассмотрим для примера программу, которая записана в файл (_program.jar). Если JRE установлена на компьютере, то достаточно кликнуть имя файла и он исполнится. Очень удобно, но есть минусы. Программа может зависнуть и ее невозможно будет выключить. Программа может что-то не выполнить и пользователь не узнает в чем дело. Потому что Виндовс плохо исполняет программы, написанные для системы Юникс.

Но это можно исправить, если открыть текстовый файл с названием (_run.bat) и записать в него команду
java -jar _program.jar
в отдельной строке (первой). Правда открыть такой файл не получится. Надо сначала открыть файл с расширением .txt, записать команду, спасти, а потом переименовать расширение на .bat. Редактируются bat-файлы тоже нестандартно. Надо его отметить, нажать правую кнопку мыши и выбрать в меню (Изменить). Только так все получится. И вот если кликнуть такой bat-файл, то сначала откроется окно терминала, такое же как было в ДОС, затем покажется написанная команда и потом она исполнится и запустится Java программа.

Но теперь, если JRE обнаружит ошибку, то она сообщит об этом в окне терминала. Пользователь получает информацию о том, о чем система Виндовс сообщить не может, если все запускать так, как там принято. Нестандартный способ более похож на то, как работают в системе Юникс, и как JRE и была сделана. Про историю я писать не буду, это долго и не всем интересно. Люди сходятся и расходятся, фирмы и страны ведут себя так же, там тоже люди. У всех свои интересы и они часто противоречивы. Нам важно, что выбор есть. Можно делать как выбрали и все проблемы решаются.

Но есть и более интересная возможность. Дело в том, что программа JRE -- это полностью независимая от Виндовс программа. И потому она переносимая. Ее не обязательно устанавливать. Если у вас есть папка с установленной программой, то вы можете просто скопировать ее на флешку или на другой компьютер и запускать. И она будет исполнять любые jar файлы. Но механизм выбора файла в JRE для системы Виндовс не прописан. Это снова надо делать через указанную выше командную строку. Однако одной строки уже мало. Дело в том, что Виндовс не знает где искать файл java.exe. Если программа не установлена, то путь для ее поиска не прописан. Есть два способа указать это.

Первый состоит в том, что указывается точный адрес файла java.exe, начиная от буквы диска. Но минус такого способа в том, что программа будет запрашивать другие файлы, а их она тоже не сможет найти. Лучше указать конкретный путь к папке программы в каталоге папок, где система ищет файл. Это может выглядеть так
set path=C:/aclvk/jre1.8.0_91/bin;%path%
java -jar _program.jar
pause

Теперь у нас уже три команды. Первая сообщает системе Виндовс где искать файл java.exe. Вторая запускает этот файл, а третья задерживает закрытие окна после выполнения второй команды. Это необходимо, если ошибка будет сразу и команда не выполнится. Тогда окно сразу закроется и будет непонятно что произошло.

Фокус такой комбинации команд в том, что если JRE установлена на компьютере, то она и запустится. А если нет, то запустится та версия, которая записана по указанному адресу. Адрес надо писать правильно. Компьютер дураков не понимает и исправлять их не умеет. Он будет искать файл в той папке, которая указана. Если не найдет, то ничего делать не будет. Таким способом можно указать любую из многих версий JRE, если они у вас есть. Старые версии, если они работают иногда более удобны тем, что они имеют меньший размер. А сама Java программа написана давно и новые возможности не использует.

Остался единственный вопрос -- где взять старые версии. На сайте производителя есть некоторые из старых версий. Лично я давно работаю. И когда меня просят обновить версию JRE, то я предварительно копирую папку в другое место и она не пропадает. А если ее оставить на старом месте, то загрузчик может ее уничтожить. И вот таким способом у меня накопились некоторые из старых версий JRE. Важно, что программа требует 64-битную версию. Старые 32-битные версии не годятся. У них очень слабые возможности по размеру файлов.

Программу можно запускать и прямо с флешки ничего не записывая на компьютер. Так она будет работать несколько медленнее, зато чужой компьютер не будет изменен. Но тут есть одна сложность. Не понятно какую букву Виндовс присвоит флешке. Можно сделать несколько bat-файлов и посмотрев какая буква у флешки запустить такой bat-файл, в котором эта буква указана. Вот и все. В таком режиме можно делать доклады на конференциях, семинарах или просто передавать программу без интернета. Отдали флешку и все дела.

Есть, конечно, способ запускать программу без всех этих сложностей с настройками путей и адресов. Но он не совсем красивый. Дело в том, что, к сожалению, моя программа сделана так, что она явно учитывает тот факт, что программа запускается из собственной папки. Поэтому, если необходимо отказаться от путей, то файлы (java.exe) и (_program.jar) должны находится в одной и той же папке. То есть все файлы и все папки моей программы надо вставить в папку bin внутри JRE. При этом сама программа JRE уже не является универсальной, а предназначена только для работы с моей программой.

Но для временной работы с флешки на чужом компьютере это вполне допустимая практика. Зато в таком варианте не надо ни о чем беспокоиться. Программа легко копируется и переносится куда угодно, а также запускается с флешки на любом компьютере сразу и без проблем. Это совсем хорошо, если вам нужно только что-то показывать или работать с внешними файлами. А если надо указывать имена папок и файлов во входных данных и использовать внешние менеджеры файлов, то становится не вполне удобно, потому что папка bin в JRE имеет много файлов в каталоге. И название этой папки длинное.

Но вот название папки легко переименовать, скажем одной буквой a. А самих папок там мало, только файлов много. И их можно просто не смотреть. То есть приспособиться и работать даже в таком варианте вполне можно. Открыть собственную папку для работы внутри папки bin и там все будет вам удобно. А при работе с моими программами все находится в папке pro и там тоже все просто. В таком варианте файл (_run.bat) достаточно написать с одной строкой, как это указано в самом начале.

В качестве примера я приготовил два варианта своей программы версии m75 c JRE версии 8.0_91 как с двумя папками, так и с одной, в виде двух архивов и записал их на свой диск. Ссылку не даю. Если кому надо, пишите мне в почту (kohnvict@yandex.ru) запрос. Дело в том, что эти архивы возможно со временем будут меняться и переписывать статью много раз мне не очень удобно.

.