1. Введение
В этом уроке мы рассмотрим JBang .
JBang позволяет студентам, преподавателям и профессиональным разработчикам создавать, редактировать и запускать автономные исходные или двоичные программы Java с беспрецедентной легкостью. Цель JBang — уменьшить или даже убрать церемонию и утомительную настройку , к которой все так привыкли в Java.
Мы можем включить JBang всего за одну загрузку и одну команду, чтобы создавать, редактировать и запускать Java так же просто, как Python, JavaScript, PHP и подобные языки.
На первый взгляд JBang выглядит как функция Launch Single-File Source-Code, представленная в Java 11. Однако JBang выходит за рамки этого, поддерживая несколько файлов, используя зависимости из любого совместимого с Maven репозитория , и работает с Java 8 вплоть до недавно выпущенной версии. Java 17 и выше .
2. Установка JBang
Первое, что нужно сделать, это установить JBang.
Мы можем использовать наш диспетчер пакетов для нашей ОС или использовать более общую загрузку на основе curl/iex
. Инструкции по загрузке для всех основных операционных систем можно найти на странице jbang.dev/download . В этом руководстве мы будем использовать общий подход:
В Linux, Mac или Windows с оболочкой, совместимой с bash, мы можем использовать curl:
curl -Ls https://sh.jbang.dev | bash -s - app setup
или в Windows с помощью PowerShell мы можем использовать iex:
iex "& { $(iwr https://ps.jbang.dev) } app setup"
В обоих случаях при работе в новой системе выводится что-то вроде следующего:
$ curl -Ls https://sh.jbang.dev | bash -s - app setup
Downloading JBang...
Installing JBang...
Downloading JDK 11. Be patient, this can take several minutes...
Installing JDK 11...
[jbang] Default JDK set to 11
[jbang] Setting up Jbang environment...
Please start a new Shell for changes to take effect
Мы заметим, что нам не нужно устанавливать Java для начала — JBang загружает Java Development Kit (JDK) с сайта acceptopenjdk (теперь Eclipse Adoptium), когда это необходимо.
Чтобы проверить правильность установки JBang, запустите новую оболочку и запустите версию jbang.
JBang распечатает информацию о версии (примечание: JBang часто выпускает релизы, поэтому версия уже может быть выше):
$ jbang version
0.83.1
Теперь мы готовы начать использовать JBang.
3. Наш первый Java (скрипт)
Чтобы создать наш первый файл Java, мы можем использовать jbang init
:
$ jbang init hello.java
[jbang] File initialized. You can now run it with 'jbang hello.java' or edit it using 'jbang edit --open=[editor] hello.java' where [editor] is your editor or IDE, e.g. 'netbeans'
Теперь мы можем запустить это с помощью jbang hello.java
или ./hello.java
, если позволяет наша оболочка. Попробуем запустить его дважды:
./hello.java
[jbang] Building jar...
Hello World
❯ ./hello.java
Hello World
Вот и все — создание и запуск java без настройки инструментов сборки или даже компиляции . Всем занимается JBang. Обратите внимание, как он печатает «Building jar» в первый раз, но не во второй раз. Во второй раз он просто печатает «Hello World».
Исходный код не изменился во второй раз, когда JBang повторно использует уже созданный jar.
Давайте сделаем это более захватывающим и создадим java-файл, который использует внешние зависимости. Мы можем сделать это с помощью шаблона:
jbang init -t cli hellocli.java
Кли — один из доступных шаблонов
по умолчанию. Запустив список шаблонов jbang
, мы можем увидеть список, который доступен для использования:
$ jbang template list
agent = Agent template
cli = CLI template
hello = Basic Hello World template
hello.kt = Basic kotlin Hello World template
qcli = Quarkus CLI template
qmetrics = Quarkus Metrics template
qrest = Quarkus REST template
Когда мы запустим созданный нами hellocli.java, мы должны увидеть, что он извлекает зависимость Picocli и использует аргументы, которые мы передаем:
$ jbang hellocli.java ForEach
[jbang] Resolving dependencies...
[jbang] Resolving info.picocli:picocli:4.5.0...Done
[jbang] Dependencies resolved
[jbang] Building jar...
Hello ForEach
Если мы запустим его во второй раз, ему не нужно снова разрешать зависимость, поскольку мы не редактировали исходный код.
4. Комментарии JBang
Теперь, если мы посмотрим на hello.java или hellocli.java, мы увидим, что это просто класс Java:
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS info.picocli:picocli:4.5.0
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;
import java.util.concurrent.Callable;
@Command(name = "hellocli", mixinStandardHelpOptions = true, version = "hellocli 0.1",
description = "hellocli made with jbang")
class hellocli implements Callable<Integer> {
@Parameters(index = "0", description = "The greeting to print", defaultValue = "World!")
private String greeting;
public static void main(String... args) {
int exitCode = new CommandLine(new hellocli()).execute(args);
System.exit(exitCode);
}
@Override
public Integer call() throws Exception { // your business logic goes here...
System.out.println("Hello " + greeting);
return 0;
}
}
Обратите внимание, что две начальные строки начинаются с //, что означает, что эта строка является комментарием в Java.
///usr/bin/env jbang "$0" "$@" ; exit $?
Но в оболочке bash/zsh первая строка позволяет нам запустить этот файл напрямую как ./hellocli.java.
//DEPS info.picocli:picocli:4.5.0
Вторая строка, начинающаяся с //DEPS
, является строкой магического маркера, которую jbang берет и использует в качестве своих зависимостей. Синтаксис, используемый для зависимостей, — это канонический формат зависимостей maven, используемый в инструментах сборки, таких как Gradle. У нас может быть несколько строк с несколькими зависимостями в каждой строке, объявляя все необходимые зависимости. JBang также будет получать транзитивные зависимости. Таким образом, нам нужно перечислить только те, которые находятся на верхнем уровне.
JBang подберет и другие волшебные маркеры. Вот основные из них:
JAVA
— укажите используемую версию Java, JAVA 11+ означает Java 11 или выше, JAVA 14 означает именно Java 14
JAVA_OPTIONS
— будет добавлено в командную строку java, используйте его для настройки параметров памяти и системных свойств
JAVAC_OPTIONS
— будет добавлено для команды компиляции javac. Используйте его, чтобы включить предварительный просмотр или другие флаги.
В документации JBang есть еще примеры .
5. Редактирование
Теперь мы понимаем, что JBang читает из файла, чтобы все заработало. Итак, как мы можем отредактировать такой файл .java и получить помощь по содержимому, рефакторинг и другие ценные функции, известные из традиционных редакторов на основе Java?
Ответ таков
jbang edit
. **С помощью
jbang edit
JBang подготовит символически связанный проект, который сможет открыть большинство современных редакторов с поддержкой Java** . Если мы запустим его как jbang edit hellocli.java,
JBang спросит, должен ли он загрузить и настроить VSCodium, чтобы начать работу без какой-либо ручной настройки. Конечно, если наша любимая IDE доступна в PATH, то есть Intellij IDEA, мы можем запустить jbang edit –open=idea hellocli.java
, и вместо этого JBang откроется через idea
.
6. Несколько файлов
До сих пор мы работали только с одним файлом; как насчет того, когда у нас есть несколько файлов? JBang обрабатывает несколько исходных файлов и произвольных ресурсов (таких как файлы .html) . Для этого есть две команды: //SOURCES
и //FILES
.
Чтобы включить конкретный исходный файл, используйте //SOURCE myfile.java
Чтобы включить все исходные файлы java, используйте //SOURCE **/*.java
.
Для ресурсов используется следующий синтаксис //FILES <точка монтирования>[=<исходный файл>]
.
// ФАЙЛЫ resource.properties //ФАЙЛЫ META-INF/resources/index.html=index.html
Здесь resource.properties
будут скопированы как есть, а META-INF/resources/index.html
получит свое содержимое из index.html
.
Все местоположения относятся к местоположению скрипта.
Вот минимальный, но полный рабочий пример с несколькими файлами:
///usr/bin/env jbang "$0" "$@" ; exit $?
// Update the Quarkus version to what you want here or run jbang with
// `-Dquarkus.version=<version>` to override it.
//DEPS io.quarkus:quarkus-bom:${quarkus.version:2.4.0.Final}@pom
//DEPS io.quarkus:quarkus-resteasy
//JAVAC_OPTIONS -parameters
//FILES META-INF/resources/index.html=index.html
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("/hello")
@ApplicationScoped
public class jbangquarkus {
@GET
public String sayHello() {
return "Hello from Quarkus with jbang.dev";
}
}
В этом примере также показана интеграция JBang с Quarkus . Используя Quarkus в качестве зависимости, этот пример просто работает и предоставляет индексную страницу по адресу http://localhost:8080 и конечную точку REST по адресу http://localhost:8080/hello .
Благодаря этому мы можем создавать небольшие сценарии и полноценные микросервисы или даже приложения, используя JBang с любой инфраструктурой на основе Java.
7. Общий код
Теперь мы можем писать, запускать и редактировать приложения на основе JBang, но как насчет того, чтобы поделиться кодом, чтобы другие могли его запускать?
Использование экспорта jbang
создает банку, которой мы можем поделиться, как и любое другое приложение Java. Более интересно делиться с помощью GitHub, Gitlab, BitBucket и т. д.
JBang поддерживает запуск исходного кода, расположенного по URL-адресу, и понимает, какой сервис за ним стоит . Так, например, чтобы запустить приведенный выше пример JBang Quarkus, мы можем запустить его непосредственно из исходного репозитория:
jbang https://github.com/foreach/tutorials/blob/jbangguide/jbang/jbangquarkus.java
JBang определит несколько файлов, необходимых для загрузки, компиляции и запуска, как мы это делали раньше с локальными файлами.
Таким образом, мы можем быстро опробовать чужой код или поделиться им с другими. Нет необходимости в настройке упаковки — JBang по своей сути позволяет легко обмениваться файлами .
7.1. Псевдонимы
URL-адрес может быть трудно ввести. К счастью, мы также можем использовать псевдонимы, т.е. псевдоним jbang add https://github.com/foreach/tutorials/blob/jbangguide/jbang/jbangquarkus.java
позволит вам использовать его как jbang jbangquarkus
.
По умолчанию JBang устанавливает эти псевдонимы глобально для текущего пользователя. Тем не менее, их также можно добавить в конкретный каталог с помощью -f,
поэтому это применимо только к этому каталогу и его подкаталогам.
jbang alias add -f . https://github.com/foreach/tutorials/blob/jbangguide/jbang/jbangquarkus.java
Отлично подходит для добавления специфичных для проекта команд. Команды, которыми можно поделиться, не привязаны к плагинам Gradle или Maven и не требуют их написания .
Эти псевдонимы хранятся в файле jbang-catalog.json, и мы можем добавлять их где угодно и размещать их где угодно.
7.2. Установки приложений
Псевдонимы ведут к еще одной полезной команде, которую можно найти в большинстве других популярных экосистем, кроме Java: установка скриптов/приложений. Подумайте о npm install
, pip install
и т.д.
В JBang это называется установкой приложения jbang
и работает как с локальными, так и с удаленными сценариями и jar-файлами JBang.
Например, чтобы установить наш hello.java:
jbang app install hello.java
Теперь к нашему пути добавлена команда hello
.
То же самое касается удаленного jbangquarkus.java
:
jbang app install https://github.com/foreach/tutorials/blob/jbangguide/jbang/jbangquarkus.java
Когда вы запускаете такую строку, она делает команду jbangquarkus
доступной на пути.
Установка приложения jbang
работает и для псевдонимов.
Как уже упоминалось, псевдонимы можно хранить и публиковать где угодно , поэтому, чтобы иметь возможность их найти, aliasesjbang.dev размещает JBang AppStore по адресу https://jbang.dev/apppstore
. Здесь мы можем искать и находить скрипты, опубликованные через файлы jbang-catalog.json
:
Таким образом, если мы создадим файл jbang-catalog.json,
его содержимое и описание появятся здесь. Попробуйте ввести «foreach» и найти скрипты, используемые в этой статье.
8. Заключение
В этой статье мы установили JBang, что позволило нам с беспрецедентной легкостью создавать, редактировать, собирать, запускать и устанавливать Java-приложения и сценарии.
Для начала работы с Java не требуется никаких настроек или предварительных знаний о Maven или Gradle . Когда мы пойдем дальше, JBang поддерживает использование координат Maven для получения зависимостей, что позволяет нам использовать что угодно из обширной экосистемы Java, включая среды выполнения, такие как Spring и Quarkus, или даже графические среды, такие как JavaFX.
JBang работает с любой современной IDE, поддерживает несколько файлов и понимает, что стоит за URL-адресом, что позволяет легко публиковать и совместно использовать исходный код и псевдонимы, запускающие jar .
У JBang есть документация и AppStore, доступные на его веб-сайте.
Примеры из этого руководства доступны на GitHub .