Простые Инструменты 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”