Традиционно приложения Java использовались для длительных процессов – серверы веб-приложений могут работать в течение нескольких дней или недель одновременно. JVM хорошо справляется с этим: Сборка мусора эффективна при использовании огромных объемов памяти, а Оптимизация с учетом профиля может сделать ваш код быстрее, чем дольше он выполняется.
Тем не менее, вполне возможно писать и недолговечные приложения, и в этом посте я покажу, как создать приложение CLI, общее время выполнения которого составляет всего пару секунд. Вы можете создавать сложные инструменты CLI на Java для обработки данных, подключения к базам данных, извлечения данных из Интернета или использования любой из библиотек Java, к которым вы привыкли.
Я буду использовать bang для упаковки и запуска приложения и picocli для обработки синтаксического анализа и вывода аргументов. Приложение отправит SMS-сообщение с помощью API обмена сообщениями Twilio в одном исходном файле Java длиной менее 100 строк.
Чтобы следовать дальше, вам понадобится:
- SDKMAN! – Я писал о почему я люблю SDKMAN! До.
- учетная запись Twilio. Если у вас его еще нет, получите его бесплатно по адресу https://twilio.com/try-twilio .
- учетные данные вашей учетной записи Twilio заданы как переменные среды :
TWILIO_ACCOUNT_SIDиTWILIO_AUTH_TOKEN.
❗ Jbang
Bank – это универсальный магазин для создания Java-приложений, которые можно запускать как скрипты. Он может загружать необходимую версию Java, добавлять зависимости и создавать самоисполняющиеся исходные файлы. Он также может запускать Java-код непосредственно из Интернета, из репозиториев github или даже из Twitter (если вы можете поместить свой код в 280 символов ).
Использование SDKMAN! установите jibing с помощью: sdk install jbang .
Для нетерпеливых: После установки вы можете пропустить остальную часть этого поста и запустить код непосредственно из GitHub с помощью jbang https://github.com/mjg123/SendSmsJbang/blob/master/SendSms.java – при первом запуске вам будет напомнено, что запуск кода с URL-адресов по своей сути небезопасен – хотя здесь вы можете мне доверять 😉
Чтобы создать новый сценарий для приложения CLI, в пустом каталоге запустите:
jbang init --template=cli SendSms.java
Это создает один файл, SendSms.java который вы можете запустить непосредственно с помощью ./SendSms.java . Этот файл действителен как в качестве исходного кода Java, так и в качестве сценария оболочки, благодаря первой строке:
//usr/bin/env jbang "$0" "$@" ; exit $?
Это ловкий трюк, который работает как Java, поскольку это комментарий. В качестве сценария оболочки он запускает jbang , передавая имя исходного файла и любые аргументы.
Во второй строке показано, как добавить зависимости в сценарий jbang:
//DEPS info.picocli:picocli:4.2.0
Это стандартный GROUP_ID:ARTIFACT_ID:VERSION формат зависимостей, используемый gradle и другими инструментами сборки.
Остальная часть файла представляет собой обычный Java-код, который является “Привет, мир” для picocli, библиотеки для создания приложений CLI на Java.
Последнее, что нужно сделать с jbing, – это создать проект, который работает в среде IDE. Вы не можете просто открыть SendSms.java file, потому что банку необходимо загрузить зависимости и добавить их в путь к классу.
Узнайте, как запустить свою ИДЕЮ из командной строки. Для меня в Linux это idea.sh – для вас это может быть идея или затмение или код
jbang edit --live=SendSms.java
Эта команда будет ждать неопределенное время, наблюдая за изменениями в проекте. Для тестирования приложения во время работы я считаю, что проще всего иметь другой открытый терминал в том же каталоге. Обязательно откройте этот после установки jbang, чтобы убедиться, что он находится в вашем $PATH . Теперь давайте перейдем к коду.
Клавиатура Пикколи
Picocli – это библиотека для создания приложений CLI на Java. Цель на сегодняшний день состоит в том, чтобы изменить существующий SendSms.java так что он действительно отправляет SMS. Аргументами скрипта будут:
- номер телефона
to(возможно, номер вашего мобильного телефона) - номер
from(ваш номер Twilio) - текст сообщения может быть указан в конце команды
Телефонные номера всегда должны быть в формате E.164 . Запуск скрипта будет выглядеть следующим образом:
./SendSms.java \
--to +4477xxxxxx46 \
--from +1528xxxxx734 \
Ahoy there 👋
Если сообщение не находится в конце команды, оно будет считано из стандартного ввода, что означает, что вы можете использовать скрипт в конвейере следующим образом:
fortune | ./SendSms.java --to +4477xxxxxx46 --from +1528xxxxx734
( fortune – это команда UNIX, которая выводит “смешные” кавычки)
⁉️ Параметры и параметры командной строки
Picocli различает опции и параметры :
- Параметры имеют имена, заданные флагами, и могут отображаться в любом порядке:
--toи--from– это варианты. - Параметры являются позиционными, слова сообщения будут параметрами, если они заданы в конце команды.
Удалите приватную строку приветствия и ее аннотацию, а также добавьте параметры и опции для --в --из и сообщение:
@CommandLine.Option(
names = {"-t", "--to"},
description = "The number you're sending the message @|bold to|@",
required = true)
private String toPhoneNumber;
@CommandLine.Option(
names = {"-f", "--from"},
description = "The number you're sending the message @|bold from|@",
required = true)
private String fromPhoneNumber;
@Parameters(
index = "0",
description = "The message to send",
arity = "0..\*")
private String[] message;
Первые две выделенные строки содержат текст, окруженный @|жирным шрифтом ... |@ , который указывает picocli на формат слова к и из .
Для сообщения мы указываем арность как 0.. * что означает “ноль или более параметров”, которые будут собраны в массив строк. Обратите внимание, что если есть ноль, то message будет null вместо пустого массива.
🚪 О кодах выхода
Пропустить метод main – действие выполняется в методе call , который возвращает Целое число , используемое в качестве кода выхода скрипта . Код выхода из 0 означает “успех”, а любое другое число означает “неудачу”. Этот сценарий завершится с 1 за любую ошибку. Есть несколько кодов выхода со специальными значениями , но ни один из них не будет применяться к этому скрипту.
📩 Построение текста сообщения
Если сообщение задано в конце команды, то оно будет в сообщении String[] . Если нет, то массив будет иметь значение null и нам нужно прочитать из Стандартного ввода (stdin). В Picocli нет ничего для чтения из stdin, но вы можете сделать это с помощью Scanner .
Удалите код из метода call() и замените его следующим:
String wholeMessage;
if (message != null) {
wholeMessage = String.join(" ", message);
} else {
var scanner = new Scanner(System.in).useDelimiter("\\A");
wholeMessage = "";
if (scanner.hasNext()) {
wholeMessage = scanner.next();
}
}
if (wholeMessage.isBlank()){
printlnAnsi("@|red You need to provide a message somehow|@");
return 1;
}
Если сообщение ненулевое, соедините части вместе пробелами, в противном случае используйте Scanner для чтения из stdin. Использование разделителя \\A с помощью Scanner будет считывать весь ввод как один токен – известный как Глупый трюк со сканером по крайней мере с 2004 года.
Наконец, если нет сообщения ни от одного из источников, выведите сообщение об ошибке и завершите работу с 1 . Я добавил println Ansi метод выше call() для включения форматированного вывода – это выглядит следующим образом:
private void printlnAnsi(String msg) {
System.out.println(CommandLine.Help.Ansi.AUTO.string(msg));
}
📲 Отправка SMS-сообщения
Под методом call() добавьте этот метод sendSMS :
private void sendSMS(String to, String from, String wholeMessage) {
Twilio.init(
System.getenv("TWILIO_ACCOUNT_SID"),
System.getenv("TWILIO\_AUTH\_TOKEN"));
Message.creator(
new PhoneNumber(to),
new PhoneNumber(from),
wholeMessage)
.create();
}
Это все, что нужно для отправки SMS с помощью Twilio. Чтобы это сработало, нам нужно добавить зависимость от вспомогательной библиотеки Twilio Java, поэтому добавьте эту строку в начало файла, под зависимостью picocli:
//DEPS com.twilio.sdk:twilio:7.54.2
Молоток и гаечный ключ Присоединяюсь к нему
Последнее, что нужно сделать, это позвонить отправить SMS с вызова . Добавление этого кода в конец метода call сделает именно это:
try {
System.out.print("Sending to ..." + toPhoneNumber + ": ");
sendSMS(toPhoneNumber, fromPhoneNumber, wholeMessage);
printlnAnsi("@|green OK|@");
} catch (Exception e) {
printlnAnsi("@|red FAILED|@");
printlnAnsi("@|red " + e.getMessage() + "|@");
return 1;
}
return 0;
Все будет хорошо, это отправит SMS-сообщение. Любое исключение, такое как неверные учетные данные или использование несуществующего номера телефона, поместит нас в блок catch , где мы напечатаем ошибку красным цветом и завершим работу с 1 .
Вот и все! Вы можете запустить окончательный сценарий с помощью:
./SendSms.java --to--from AHOY-HOY
…и сообщение придет.
🎁 Подведение итогов
Мы видели, что Java полезна не только для больших веб-приложений – она отлично работает и для кратковременных CLI-приложений, что стало проще с помощью jbang и picocli. Однако это был всего лишь пример – у Twilio уже есть очень полезный CLI , который может отправлять SMS и делать многое другое.
Просто для развлечения я также создал версию кода, которая поместилась бы в твит .
Я бы с удовольствием послушал о забавных (или серьезных) инструментах CLI, которые вы создаете с помощью Java, не волнуйтесь, если они содержат более 280 символов. Найди меня в Твиттере или по электронной почте:
Я не могу дождаться, чтобы увидеть, что ты построишь!
Оригинал: “https://dev.to/mjg123/how-to-build-a-cli-app-in-java-using-jbang-and-picocli-262n”