запуск приложения java jar
Как открыть файл jar?
В этой статье мы подробно расскажем о файлах формата jar. Вы узнаете как открыть файл в формате jar, какие программы для этого понадобятся, а так же много полезной информации.
Что такое формат файла jar
Расширение Java ARchive – это специальный архив с приложениями. Если говорить простым языком, это документ ZIP, который дополнен определенными функциями. Как же его использовать на разных девайсах?
Как запустить файл в windows
На операционной системе Виндовс можно запустить jar файл специальными программами. Давайте перечислим основные варианты.
Oracle Java Runtime Environment
Это приложение, которое позволит просматривать документы на персональном компьютере. Вы сможете работать даже с теми играми, которые наотрез отказываются «сотрудничать» со стандартными программами.
Eclipse
Это бесплатная разработка, которая создана для работы с таким форматом. Простое и понятное меню не вызовет проблем и сложностей. В нем разберется начинающий пользователь, ведь все разложено по полочкам.
Этот архиватор поможет разобраться, как открыть файл jar. Подходит для использования документов с соответствующим форматом (Рисунок 2). Полнофункциональное приложение доступно для бесплатного скачивания. Скачать программу 7-Zip возможно на нашем сайте.
WinRAR
Этот архиватор умеет обрабатывать большинство расширений. С ним намного комфортнее понять, как запустить jar файл (Рисунок 3). Продукт используется на разных платформах.
Примечание: WinRAR Вы можете скачать у нас с сайта.
IZArc
Бесплатная программка, которая поддерживает работу с доками разных форматов. Очень простая и понятная разработка. Интерфейс продуман до мельчайших подробностей.Программа IZArc доступна на нашем сайте.
WinZIP
Еще один достаточно распространенный архиватор, который предназначен для расширения. WinZIP возможно скачать с нашего сайта. Отличается отменным сжатием памяти, поэтому есть возможность сэкономить место на жестком диске (Рисунок 4). Пакет предложен в разных версиях, что позволяет подобрать подходящий вариант для своего оборудования.
ZipZag
Работа с архивами будет комфортной и простой. Каждый пункт меню понятен для пользователя с небольшим опытом. Вы сможете просматривать документы формата, не сталкиваясь с проблемами.
Java Development Kit
Интерактивный пакет разработан специально для подобных расширений. Это полноценный набор инструментов, которые выполняют полезные функции.
Теперь вы знаете, как запустить jar файл в windows с помощью специальных пакетов.
Как запустить файл на linux
Линукс – это операционная система, на которой тоже часто используются подобные форматы. Посмотрите, как запустить jar файл linux, не сталкиваясь с проблемами.
Eclipse
Самый простой и доступный каждому пользователю вариант. С ним можно быстро загрузить то, что нужно, не сталкиваясь со всевозможными сложностями. За скачивание пакета не придется платить.
Java Runtime Environment
Она позволяет запустить приложения, которые написаны на языке Java. Платформа подходит для эксплуатации на девайсах, работающих на операционной системе Линукс.
Запуск jar файла на MacOS
Для этой ОС тоже существуют пакеты, дающие возможность насладиться любимыми играми и прочими апплетами.
Apple Jar Launcher
Отменный пакет, с которым запуск jar файла будет оперативным. Работа с ним простая и понятная. Пользователи с легкостью разберутся в меню.
WinZip Mac
Вариант для архивирования и хранения данных. Быстро открывает соответствующие расширения (Рисунок 5).
Java Runtime Environment
Платформа, установка которой позволит вам запускать документы. Не занимает много места, устанавливается менее чем за 2 минуты.
Как открыть файл на андроиде
Многие современные девайсы работают на ОС Андроид. Вы можете узнать, как открыть файл jar на андроиде без труда.
File Viewer
Универсальная прога, которая позволяет смотреть содержание документов с разными форматами. Как нельзя лучше подходит для этой операционной системы.
Как открыть файл с помощью java?
Вы не знаете, как открыть jar файл с помощью java? Для просмотра документов есть множество приложений Java. Вы можете выбрать то, что подходит для вашей операционной системы. Изучите характеристики каждого из вариантов, чтобы подобрать оптимальный пакет для своего гаджета.
Если вы ищете, чем открыть jar файл на компьютере, просмотрите вышеописанные способы. Среди них вы обязательно что-то возьмете на заметку!
Инструменты для запуска и разработки Java приложений, компиляция, выполнение на JVM
Ни для кого не секрет, что на данный момент Java — один из самых популярных языков программирования в мире. Дата официального выпуска Java — 23 мая 1995 года.
Эта статья посвящена основам основ: в ней изложены базовые особенности языка, которые придутся кстати начинающим “джавистам”, а опытные Java-разработчики смогут освежить свои знания.
* Статья подготовлена на основе доклада Евгения Фраймана — Java разработчика компании IntexSoft.
В статье присутствуют ссылки на внешние материалы.
1. JDK, JRE, JVM
Java Development Kit — комплект разработчика приложений на языке Java. Он включает в себя Java Development Tools и среду выполнения Java — JRE (Java Runtime Environment).
Java development tools включают в себя около 40 различных тулов: javac (компилятор), java (лаунчер для приложений), javap (java class file disassembler), jdb (java debugger) и др.
Среда выполнения JRE — это пакет всего необходимого для запуска скомпилированной Java-программы. Включает в себя виртуальную машину JVM и библиотеку классов Java — Java Class Library.
JVM — это программа, предназначенная для выполнения байт-кода. Первое преимущество JVM — это принцип “Write once, run anywhere”. Он означает, что приложение, написанное на Java, будет работать одинаково на всех платформах. Это является большим преимуществом JVM и самой Java.
До появления Java, многие компьютерные программы были написаны под определенные компьютерные системы, а предпочтение отдавалось ручному управлению памятью, как более эффективному и предсказуемому. Со второй половины 1990-х годов, после появления Java, автоматическое управление памятью стало общей практикой.
Существует множество реализаций JVM, как коммерческих, так и с открытым кодом. Одна из целей создания новых JVM — увеличение производительности для конкретной платформы. Каждая JVM пишется под платформу отдельно, при этом есть возможность написать ее так, чтобы она работала быстрее на конкретной платформе. Самая распространённая реализация JVM — это JVM Hotspot от OpenJDK. Также есть реализации IBM J9, Excelsior JET.
2. Выполнение кода на JVM
Согласно спецификации Java SE, для того, чтобы получить код, работающий в JVM, необходимо выполнить 3 этапа:
3. Загрузчики классов и их иерархия
Вернемся к загрузчикам классов — это специальные классы, которые являются частью JVM. Они загружают классы в память и делают их доступными для выполнения. Загрузчики работают со всеми классами: и с нашими, и с теми, которые непосредственно нужны для Java.
Представьте ситуацию: мы написали свое приложение, и помимо стандартных классов там есть наши классы, и их очень много. Как с этим будет работать JVM? В Java реализована отложенная загрузка классов, иными словами lazy loading. Это значит, что загрузка классов не будет выполняться до тех пор, пока в приложении не встретится обращение к классу.
Иерархия загрузчиков классов
Первый загрузчик классов — это Bootstrap classloader. Он написан на C++. Это базовый загрузчик, который загружает все системные классы из архива rt.jar. При этом, есть небольшое отличие между загрузкой классов из rt.jar и наших классов: когда JVM загружает классы из rt.jar, она не выполняет все этапы проверки, которые выполняются при загрузке любого другого класс-файла т.к. JVM изначально известно, что все эти классы уже проверены. Поэтому, включать в этот архив какие-либо свои файлы не стоит.
Следующий загрузчик — это Extension classloader. Он загружает классы расширений из папки jre/lib/ext. Допустим, вы хотите, чтобы какой-то класс загружался каждый раз при старте Java машины. Для этого вы можете скопировать исходный файл класса в эту папку, и он будет автоматически загружаться.
Еще один загрузчик — System classloader. Он загружает классы из classpath’а, который мы указали при запуске приложения.
Процесс загрузки классов происходит по иерархии:
4. Структура Сlass-файлов и процесс загрузки
Перейдем непосредственно к структуре Class-файлов.
Все числа, строки, указатели на классы, поля и методы хранятся в Сonstant pool — области памяти Meta space. Описание класса хранится там же и содержит имя, модификаторы, супер-класс, супер-интерфейсы, поля, методы и атрибуты. Атрибуты, в свою очередь, могут содержать любую дополнительную информацию.
Таким образом, при загрузке классов:
5. Исполнение байт-кода на JVM
В первую очередь, для исполнения байт-кода, JVM может его интерпретировать. Интерпретация — довольно медленный процесс. В процессе интерпретации, интерпретатор “бежит” построчно по класс-файлу и переводит его в команды, которые понятны JVM.
Также JVM может его транслировать, т.е. скомпилировать в машинный код, который будет исполняться непосредственно на CPU.
Команды, которые исполняются часто, не будут интерпретироваться, а сразу будут транслироваться.
6. Компиляция
Компилятор — это программа, которая преобразует исходные части программ, написанные на языке программирования высокого уровня, в программу на машинном языке, “понятную” компьютеру.
Компиляторы делятся на:
Также компиляторы могут классифицироваться по моменту компиляции:
7. Организация памяти в Java
Стек — это область памяти в Java, которая работает по схеме LIFO — “Last in — Fisrt Out” или “Последним вошел, первым вышел”.
Он нужен для того, чтобы хранить методы. Переменные в стеке существуют до тех пор, пока выполняется метод в котором они были созданы.
Когда вызывается любой метод в Java, создается фрейм или область памяти в стеке, и метод кладется на его вершину. Когда метод завершает выполнение, он удаляется из памяти, тем самым освобождая память для следующих методов. Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError. К примеру, это может произойти, если у нас будет рекурсивная функция, которая будет вызывать сама себя и памяти в стеке не будет хватать.
Ключевые особенности стека:
Куча разбита на несколько более мелких частей, называемых поколениями:
Почему отказались от Permanent generation? В первую очередь, это из-за ошибки, которая была связана с переполнением области: так как Perm имел константный размер и не мог расширяться динамически, рано или поздно память заканчивалась, кидалась ошибка, и приложение падало.
Meta space же имеет динамический размер, и во время исполнения он может расширяться до размеров памяти JVM.
Ключевые особенности кучи:
Основываясь на информации выше, рассмотрим, как происходит управление памятью на простом примере:
У нас есть класс App, в котором единственный метод main состоит из:
— примитивной переменой id типа int со значением 23
— ссылочной переменной pName типа String со значением Jon
— ссылочной переменной p типа person
Как уже упоминалось, при вызове метода на вершине стека создаётся область памяти, в которой хранятся данные, необходимые этому методу для выполнения.
В нашем случае, это ссылка на класс person: сам объект хранится в куче, а в стеке хранится ссылка. Также в стек кладется ссылка на строку, а сама строка хранится в куче в String pool. Примитив хранится непосредственно в стеке.
Для вызова конструктора с параметрами Person (String) из метода main() в стеке, поверх предыдущего вызова main() создается в стеке отдельный фрейм, который хранит:
— this — ссылка на текущий объект
— примитивное значение id
— ссылочную переменную personName, которая указывает на строку в String Pool.
После того, как мы вызвали конструктор, вызывается setPersonName(), после чего снова создается новый фрейм в стеке, где хранятся те же данные: ссылка на объект, ссылка на строку, значение переменной.
Таким образом, когда выполнится метод setter, фрейм пропадет, стек очистится. Далее выполняется конструктор, очищается фрейм, который был создан под конструктор, после чего метод main() завершает свою работу и тоже удаляется из стека.
Если будут вызваны другие методы, для них будут также созданы новые фреймы с контекстом этих конкретных методов.
8. Garbage collector
В куче работает Garbage collector — программа, работающая на виртуальной машине Java, которая избавляется от объектов, к которым невозможно получить доступ.
Разные JVM могут иметь различные алгоритмы сборки мусора, также существуют разные сборщики мусора.
Мы поговорим о самом простом сборщике Serial GC. Сборку мусора мы запрашиваем при помощи System.gc().
Как уже было упомянуто выше, куча разбита на 2 области: New generation и Old generation.
New generation (младшее поколение) включает в себя 3 региона: Eden, Survivor 0 и Survivor 1.
Old generation включает в себя регион Tenured.
Что происходит, когда мы создаем в Java объект?
В первую очередь объект попадает в Eden. Если мы создали уже много объектов и в Eden уже нет места, срабатывает сборщик мусора и освобождает память. Это, так называемая, малая сборка мусора — на первом проходе он очищает область Eden и кладёт “выжившие” объекты в регион Survivor 0. Таким образом регион Eden полностью высвобождается.
Если произошло так, что область Eden снова была заполнена, garbage collector начинает работу с областью Eden и областью Survivor 0, которая занята на данный момент. После очищения выжившие объекты попадут в другой регион — Survivor 1, а два остальных останутся чистыми. При последующей сборке мусора в качестве региона назначения опять будет выбран Survivor 0. Именно поэтому важно, чтобы один из регионов Survivor всегда был пустым.
JVM следит за объектами, которые постоянно копируются и перемещаются из одного региона в другой. И для того, чтобы оптимизировать данный механизм, после определённого порога сборщик мусора перемещает такие объекты в регион Tenured.
Когда в Tenured места для новых объектов не хватает, происходит полная сборка мусора — Mark-Sweep-Compact.
Во время этого механизма определяется, какие объекты больше не используются, регион очищается от этих объектов, и область памяти Tenured дефрагментируется, т.е. последовательно заполняется нужными объектами.
JAR-файлы не открываются в Windows 10 [FIX]
Многие веб-сайты используют Java для предоставления вам определенных функций. Помимо веб-сайтов, Java и Java-приложения могут также запускаться на вашем ПК локально.
Java-приложения сохраняются в виде jar-файлов, но многие пользователи сообщают, что jar-файлы не открываются в Windows 10. Хотя это может быть большой проблемой, но есть способ ее исправить!
Файлы JAR не открываются в Windows 10 – как мы можем это исправить?
Исправлено – файлы Jar не открываются в Windows 10
Если вы не можете запустить jar-файлы на ПК с Windows 10, возможно, вам придется переустановить Java Runtime Environment. Для этого выполните следующие действия:
После этого перейдите на веб-сайт Java и загрузите последнюю версию программного обеспечения.
После установки проверьте, решена ли проблема. Имейте в виду, что удаление предыдущей установки Java не обязательно, поэтому вы можете пропустить этот шаг и просто установить последнюю версию поверх.
Java также будет автоматически проверять наличие обновлений, и если обновления будут доступны, вы получите уведомление.
Загрузите этот инструмент, мы настоятельно рекомендуем
Решение 2. Установите сопоставление файлов
Файлы Jar не могут быть запущены на вашем компьютере, если у вас нет соответствующих ассоциаций. Например, файлы JAR могут быть связаны для запуска с другими приложениями, или они могут полностью не иметь ассоциации файлов.
Если ситуация последняя, вы не сможете запускать jar-файлы на вашем ПК. Однако вы можете легко решить эту проблему, изменив сопоставление файлов для файлов JAR. Для этого выполните следующие действия:
Этот метод предлагает ограниченные возможности, и вы можете выбирать только приложения, распознаваемые Windows 10. К счастью, есть другой способ, который вы можете попробовать. Чтобы изменить ассоциации файлов, выполните следующие действия:
Обнаружены проблемы с ассоциацией файлов Windows? Не беспокойтесь, мы вернулись с этим руководством!
Решение 3 – используйте Jarfix
Если вы не можете открыть файлы JAR в Windows 10, вы можете решить проблему с помощью Jarfix. Как упоминалось ранее, эти типы проблем могут возникать из-за ассоциации файлов, но вы можете легко исправить их с помощью этого простого приложения.
Для этого выполните следующие действия:
После использования этого приложения вы сможете запускать файлы JAR в Windows 10 без каких-либо проблем.
Процесс довольно прост, и вы можете сделать это, выполнив следующие действия:
После этого вам необходимо выполнить следующие шаги:
После этого ваш файл jar должен открыться без проблем. Помните, что вам не нужно перемещать файл JAR в корневой каталог, но благодаря этому вы сможете быстрее получить доступ к файлу.
Работа в командной строке будет похожа на прогулку по парку после прочтения нашего руководства!
Решение 6 – используйте JAR Runner
Кроме того, вы также можете открыть JAR-файлы с помощью JAR Runner. Это простое и бесплатное приложение, поэтому обязательно скачайте JAR Runner.
Если вы не можете открыть загруженный файл JAR, вам необходимо проверить его расширение. Некоторые веб-браузеры могут не сохранять файлы JAR должным образом, поэтому вам нужно проверить их расширение.
Для этого выполните следующие действия:
Если эта проблема не устранена, вы можете проверить свой браузер.Иногда он может загружать файлы JAR неправильно и может вызвать эту проблему.
Чтобы исправить это, обязательно используйте другой браузер для загрузки файла и проверьте, решает ли это проблему.
Файлы JAR, не открывающиеся в Windows 10, могут быть большой проблемой, особенно если вы часто используете приложения Java. Тем не менее, вы сможете решить проблему, просто воспользовавшись одним из наших решений!
Дайте нам знать, если один из них работал для вас в комментариях ниже!
Узнайте, как запускать jar-файлы, как эксперт, с нашим полным руководством!
Примечание редактора . Это сообщение было первоначально опубликовано в апреле 2017 года и было обновлено и обновлено для обеспечения свежести, точности и полноты. Мы хотим быть уверены, что в нашем списке представлены лучшие продукты, которые будут соответствовать вашим потребностям.
Запускаем однофайловые программы в Java 11 без компилирования
Обычно для запуска этого класса требуется сначала скомпилировать его с помощью Java-компилятора (javac), который создаст файл HelloUniverse.class:
Затем нужно с помощью команды виртуальной машины Java (интерпретатора) запустить получившийся файл:
Тогда сначала запустится виртуалка, которая загрузит класс и исполнит код.
А если вам нужно быстро проверить фрагмент кода? Или вы новичок в Java (в данном случае это ключевой момент) и хотите поэкспериментировать с языком? Описанные два этапа могут всё усложнить.
В Java SE 11 можно напрямую запускать одиночные исходные файлы без промежуточной компиляции.
Эта возможность особенно полезна для новичков, которые хотят поработать с простыми программами. В сочетании с jshell получается прекрасный набор инструментов для обучения начинающих.
Профессионалы могут с помощью этих инструментов изучать нововведения в языке или тестировать незнакомые API. На наш взгляд, лучше автоматизировать многие задачи, вроде написания Java-программ в виде скриптов с последующим исполнением из оболочки ОС. В результате мы можем гибко работать с shell-скриптами и пользоваться всеми возможностями Java. Поговорим об этом подробнее во второй части статьи.
Эта прекрасная возможность Java 11 позволяет напрямую исполнять одиночный исходный файл без компилирования. Давайте обсудим.
Что вам потребуется
Для запуска кода, приведённого в статье, вам понадобится версия Java не ниже 11. На момент написания статьи текущим релизом был Java SE Development Kit 12.0.1 — финальная версия находится здесь, достаточно принять условия лицензии и кликнуть на ссылку для вашей ОС. Если хотите поэкспериментировать с самыми свежими возможностями, то можете скачать JDK 13 early access.
Обратите внимание, что сейчас также доступны релизы OpenJDK разных вендоров, в том числе AdoptOpenJDK.
В этой статье мы будем вместо Java IDE применять обычный текстовый редактор, чтобы избежать всякой магии IDE, и использовать командную строку Java прямо в терминале.
Однако эта функция ограничена кодом, который хранится в одном файле. Вы не можете исполнять сразу несколько исходных файлов.
Чтобы обойти это ограничение, все классы нужно определять в одном файле. Никаких ограничений на их количество нет. Кроме того, пока они находятся в одном файле, не имеет значения, являются ли они публичными или частными.
Первый класс, определённый в файле, будет считаться основным, и в него нужно поместить метод main. То есть важна очерёдность.
Первый пример
Начнём с классического простейшего примера — Hello Universe!
Мы продемонстрируем описываемую возможность на разных примерах, чтобы вы получили представление, как можно её использовать в повседневном программировании.
Создайте файл HelloUniverse.java с кодом из начала статьи, скомпилируйте и запустите получившийся class-файл. Затем удалите его, сейчас поймёте зачем:
Если теперь с помощью Java-интерпретатора вы запустите class-файл без компиляции:
то увидите тот же результат: файл будет исполнен.
То есть под капотом всё же выполняется компиляция. И в случае её ошибки мы получим уведомление об этом. Можете проверить структуру директорий и убедиться, что class-файл не генерируется, компиляция выполняется в памяти.
Теперь давайте разберёмся, как это всё устроено.
Как интерпретатор Java выполняет программу HelloUniverse
В JDK 10 модуль запуска Java может работать в трёх режимах:
Система определяет ваше намерение ввести исходный файл по двум признакам:
Во втором случае выбирается режим работы с исходным файлом, и первый элемент в командной строке, который не является опцией, считается исходным файлом, который нужно скомпилировать и запустить.
Это важно в случаях, когда исходный файл представляет из себя «скрипт», который нужно выполнить, а имя файла не соответствует обычным соглашениям о наименованиях исходных файлов с Java-кодом.
Можно ли передавать в командной строке аргументы?
Давайте расширим нашу программу Hello Universe, чтобы она выводила персональное приветствие любому пользователю, зашедшему на InfoQ Universe:
Сохраним код в файле Greater.java. Обратите внимание, что имя файла не соответствует имени публичного класса. Это нарушает правила спецификации Java.
Как видите, совершенно не важно, что имена класса и файла не совпадают. Внимательный читатель мог также заметить, что мы передали в код аргументы после обработки имени файла. Это означает, что любой аргумент в командной строке, идущий после имени файла, передаётся стандартному основному методу.
Давайте сначала рассмотрим второй сценарий. Переименуем Greater.java просто в greater без расширения и попробуем выполнить:
Всё просто. Теперь рассмотрим использование нескольких классов.
Работает ли этот подход с несколькими классами?
Рассмотрим пример с двумя классами. Код проверяет, является ли заданное строковое значение палиндромом.
Вот код, сохранённый в файле PalindromeChecker.java:
Запустим снова, подставив «RaceCar» вместо «MadAm»:
Теперь подставим «Mohamed» вместо «RaceCar»:
Как видите, можно добавлять в один исходный файл сколько угодно публичных классов. Следите только за тем, чтобы основной метод был определён первым. Интерпретатор будет использовать первый класс в качестве стартовой точки для запуска программы после компилирования кода в памяти.
Можно использовать модули?
То есть код может использовать разные модули без необходимости явно определять зависимости с помощью module-info.java.
Давайте рассмотрим код, делающий HTTP-вызов с помощью нового HTTP Client API, появившегося в JDK 11. Обратите внимание, что эти API были представлены в Java SE 9 в качестве экспериментальной возможности, но теперь они имеют статус полноценной функции модуля java.net.http.
В этом примере мы вызовем простой REST API с помощью метода GET, чтобы получить список пользователей. Обратимся к публичному сервису reqres.in/api/users?page=2. Код сохраним в файл с именем UsersHttpClient.java:
Запустим программу и получим результат:
Теперь вы можете быстро тестировать новые фичи, предоставляемые разными модулями, не создавая свой собственный модуль.
Почему скрипты так важны в Java?
Сначала давайте вспомним, что такое скрипты:
Скрипт — это программа, написанная для определённого runtime-окружения, которая автоматизирует исполнение задач или команд, которые человек может исполнять поочерёдно.
Из этого общего определения мы можем вывести простое определение скриптового языка — это язык программирования, использующий высокоуровневые конструкции для интерпретации и исполнения по одной команде (или команд) за раз.
Скриптовый язык использует серии команд, записанных в файле. Часто такие языки являются интерпретируемыми (а не компилируемыми) и придерживающимися процедурного стиля программирования (хотя некоторые скриптовые языки также обладают свойствами объектно-ориентированных языков).
В целом скриптовые языки легче в освоении и быстрее в наборе кода по сравнению с более структурированными компилируемыми языками вроде Java, C и С++. К серверным скриптовым языкам относятся Perl, PHP и Python, а на клиентской стороне — JavaScript.
Долгое время Java считался хорошо структурированным, сильно типизированным компилируемым языком, который интерпретируется виртуальной машиной для выполнения на любой вычислительной архитектуре. Однако Java не так прост в изучении и прототипировании по сравнению с другими скриптовыми языками.
Тем не менее, Java уже исполнилось 24 года, его использует около 10 млн разработчиков по всему миру. В последних релизах добавили ряд новых возможностей, чтобы молодым программистам было легче изучать этот язык, а также чтобы пользоваться функциями языка и API без компилирования и IDE. Например, в Java SE 9 появился инструмент JShell (REPL), который поддерживает интерактивное программирование.
В Java 11 есть два основных способа использования скриптов:
Shebang-файлы: запускаем Java как shell-скрипт
Итак, в Java SE 11 появилась поддержка скриптов, включая традиционные shebang-файлы из мира *nix. Для их поддержки не потребовалось спецификации языка.
В shebang-файле первые два байта должны быть 0x23 и 0x21. Это ASCII-кодировка символов #. Все последующие байты в файле читаются на основе действующей по умолчанию на данной платформе системы кодировки.
Таким образом, чтобы файл исполнился с помощью встроенного в ОС shebang-механизма, необходимо соблюсти лишь одно требование: чтобы первая строка начиналась с #. Это означает, что нам не нужна какая-то особенная первая строка, когда модуль запуска Java явно используется для запуска кода из исходного файла, как в случае с HelloUniverse.java.
Запустим следующий пример в терминале, работающем под macOS Mojave 10.14.5. Но сначала определим важные правила, которым нужно следовать при создании shebang-файла:
Запустим снова с помощью команды, которая передаёт родительскую директорию, и проверим результат.
Примечание: при оценке исходного кода интерпретатор игнорирует shebang-строку (первую строку). Таким образом, shebang-файл можно явно вызвать с помощью модуля запуска, например, с дополнительными опциями:
Также нужно отметить: если скриптовый файл лежит в текущей директории, то вы можете выполнить его так:
А если скрипт лежит в директории, путь которой указан в пользовательском PATH, то выполнить его можно так:
И в завершение дам несколько советов, о чём нужно помнить при использовании скриптов.
Советы
Обратите внимание на два файла java.java в пакете HelloUniverse и файл HelloUniverse.java в той же директории. Если вы попробуете выполнить:
то какой файл будет выполнен первым, а какой вторым? Модуль запуска больше не ссылается на class-файл в пакете HelloUniverse. Вместо этого он загрузит и выполнит исходный файл HelloUniverse.java, то есть будет запущен файл в текущей директории.
Shebang-файлы открывают массу возможностей по созданию скриптов для автоматизации всевозможных задач с использованием средств Java.
Резюме
Начиная с Java SE 11 и впервые в истории программирования вы можете напрямую исполнять скрипты с Java-кодом без компилирования. Это позволяет писать скрипты на Java и исполнять их из *nix-командной строки.
Поэкспериментируйте с этой функцией и поделитесь знанием с другими.