Рубрики
Без рубрики

Как создать приложение CLI на Java с использованием j band и picocli

Традиционно приложения Java использовались для длительно выполняющихся процессов – серверов веб-приложений c… Помеченный java, cli.

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

[ этот код на GitHub ]

Первые две выделенные строки содержат текст, окруженный @|жирным шрифтом ... |@ , который указывает 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;
}

[ этот код на GitHub ]

Если сообщение ненулевое, соедините части вместе пробелами, в противном случае используйте Scanner для чтения из stdin. Использование разделителя \\A с помощью Scanner будет считывать весь ввод как один токен – известный как Глупый трюк со сканером по крайней мере с 2004 года.

Наконец, если нет сообщения ни от одного из источников, выведите сообщение об ошибке и завершите работу с 1 . Я добавил println Ansi метод выше call() для включения форматированного вывода – это выглядит следующим образом:

private void printlnAnsi(String msg) {
  System.out.println(CommandLine.Help.Ansi.AUTO.string(msg));
}

[ этот код на GitHub ]

📲 Отправка 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();
}

[ этот код на GitHub ]

Это все, что нужно для отправки 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;

[ этот код на GitHub ]

Все будет хорошо, это отправит SMS-сообщение. Любое исключение, такое как неверные учетные данные или использование несуществующего номера телефона, поместит нас в блок catch , где мы напечатаем ошибку красным цветом и завершим работу с 1 .

Вот и все! Вы можете запустить окончательный сценарий с помощью:

./SendSms.java --to  --from  AHOY-HOY

…и сообщение придет.

🎁 Подведение итогов

Мы видели, что Java полезна не только для больших веб-приложений – она отлично работает и для кратковременных CLI-приложений, что стало проще с помощью jbang и picocli. Однако это был всего лишь пример – у Twilio уже есть очень полезный CLI , который может отправлять SMS и делать многое другое.

Просто для развлечения я также создал версию кода, которая поместилась бы в твит .

Я бы с удовольствием послушал о забавных (или серьезных) инструментах CLI, которые вы создаете с помощью Java, не волнуйтесь, если они содержат более 280 символов. Найди меня в Твиттере или по электронной почте:

🐦 @@Максимальная загрузка

📧 mgilliard@twilio.com

Я не могу дождаться, чтобы увидеть, что ты построишь!

Оригинал: “https://dev.to/mjg123/how-to-build-a-cli-app-in-java-using-jbang-and-picocli-262n”