Традиционно приложения 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”