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

Написание Инструментов командной строки Java является Громоздким Делом… Или так оно и есть???

Вы можете написать простые инструменты Java для запуска из командной строки без особых хлопот, если пойдете на компромисс. Помеченный java, bash.

Простые Инструменты Java

JDK поставляется с множеством отличных инструментов командной строки, которые поддерживают разработку. Но в каждом проекте, который я когда-либо делал, я обнаруживаю, что мне нужно немного больше от инструмента, который я не могу получить от него, что обычно означает, что я должен написать свой собственный. Каждый инструмент, который я пишу, предназначен для меня, и обычно этого достаточно, чтобы выполнить работу.

Я пишу много инструментов командной строки для выполнения своей дополнительной работы. Большинство разработчиков Java, с которыми я работаю, ненавидят идею написания Java-инструмента командной строки. Они должны быть скомпилированы, а затем их нужно запустить. Использование Maven помогает с целью exec:java . Без Maven вы пишете долго javac команды для компиляции, затем длинный java команда для его запуска. Но если вы будете осторожны и будете придерживаться того, что есть в JDK, чтобы написать небольшой инструмент для выполнения работы, вы можете использовать трюк с оболочкой, который я видел несколько лет назад , чтобы сделать написание Java намного больше похоже на написание Python.

Простой Пример Bash/Java

Ранее я упоминал, что я большой поклонник Bash. Все, что вам нужно, – это один исходный файл Java, и вы можете написать что-то полезное очень быстро. Рассмотрим этот исходный файл:

/*bin/mkdir -p /tmp/.java/classes 2> /dev/null

# Compile the program.
#
javac -d /tmp/.java/classes $0

# Run the compiled program only if compilation succeeds.
#
[[ $? -eq 0 ]] && java -cp /tmp/.java/classes $(basename ${0%.*}) "$@"
exit
*/

class SimpleGreeting {
    public static void main(String... args) {
        System.out.println("Hello");
    }
}

Запустить это в оболочке так же просто, как:

$ bash SimpleGreeting.java
Hello
$

Что здесь произошло? Почему это было так легко?

Ответ содержится в комментарии вверху. Сценарии оболочки часто начинаются с директивы интерпретатора shebang . Исходный файл Java с этим комментарием вверху выполняет команды в bash.

Разрушение директивы интерпретатора

Легко понять, что здесь происходит:

  • Создайте подкаталог в каталоге /tmp перенаправление вывода в /dev/нуль если каталог уже существует (нас не волнует сообщение об ошибке).
  • Скомпилируйте исходный файл и запишите файл .class в целевой каталог, который мы только что создали.
  • Запустите файл class из каталога, в который он только что был записан, удалив суффикс исходного файла. Но запускайте его только в том случае, если он скомпилирован.
  • Завершите процесс с кодом возврата java запуска.

Самое приятное в написании инструментов таким способом заключается в том, что вы можете вносить изменения в код и “запускать” его снова, не беспокоясь о необходимости компиляции. Если у вас произошла ошибка, компилятор сообщит вам, где она находится, и не будет пытаться запустить вашу программу.

Чаевые

Эффективная разработка инструментов означает, что вы должны:

  • Используйте как можно меньше зависимостей вне JDK (в идеале их нет).
  • Держите свои инструменты ПРОСТЫМИ, короткими и в 1 исходном файле.
  • Запустите из командной строки с помощью bash SourceFile.java <аргументы> .
  • Избегайте слишком большого количества логики в директиве интерпретатора; но не бойтесь использовать логику, если это необходимо.

Примеры Инструментов

Я написал несколько инструментов, которые мне очень помогли:

  • Обслуживание javadoc из zip-файла JDK docs и файлов javadoc jar в локальном репозитории Maven
  • Сброс секретных ключей Base64/raw из хранилищ ключей
  • Сброс закрытого ключа из хранилища ключей
  • Импорт сгенерированного извне секретного ключа в хранилище ключей
  • Проверка подключения LDAP/JDBC

Есть масса вещей, которые вы можете быстро сделать, используя только JDK. Возможно, в нем не все батарейки включены но в нем есть все виды, которые вы могли бы найти, не заходя в специализированный магазин.

Подтверждение

Я хотел бы еще раз подтвердить Джесси Уилсон чья суть для Rip.java (ссылка выше) вдохновил этот пост. Он умный чувак, который любит все делать быстро (очевидно).

Мои примеры находятся в моем репозитории GitHub Dotfiles . Загляните в каталог Сценариев, и вы найдете мои инструменты вместе со всеми другими вещами, которые я использую.

Оригинал: “https://dev.to/argherna/writing-java-command-line-tools-is-cumbersome-or-is-it–p42”