2 мая 2018
Понятие runnable jar или uber jar возникает тогда, когда вы задумываетесь о разворачивании вашего проекта на удалённом сервере. У вас должна быть уверенность в том, что в произвольном окружении, где окажется ваше приложение, в classpath будут все необходимые классы из используемых вами библиотек.
Конечно, никакой проблемы нет, если вы вообще не используете сторонние библиотеки. Но я уверен, что всё-таки используете, если только ваш проект не «Hello World».
Чтобы гарантировать наличие нужных версий всех библиотек, нам проще поставлять их вместе с нашим приложением. Для удобства развёртывания все библиотеки можно поместить в один jar-файл. Подробнее о том, что такое jar-архив и как его получить, мы рассматривали в статье Как скомпилировать исходники java вручную.
Рассмотрим конкретный пример. Пусть имеется приложение, которое использует класс StringUtils из популярного проекта Apache Commons Lang:
В pom-файле нашего maven-проекта должно быть прописано следующее:
Теперь, если вы выполните команду maven clean package и попробуете запустить полученный jar-файл из папки target через java -jar, по получите сообщение «no main manifest attribute».
Итак, чтобы получить «запускаемый» (runnable) jar со всеми необходимыми библиотеками, нам всего лишь надо расширить секцию build ещё одним плагином от того же Apache под названием shade.
Единственное, что здесь надо указать – это параметр mainClass, т.е. тот класс, где находится статический метод main().
Теперь, если ещё раз собрать наш проект, то на выходе вы получите не один, а два jar-файла. Один в несколько килобайт, а другой в несколько раз больше. Если вы откроете через любой архиватор большой jar-файл, то увидите внутри помимо наших классов также и все классы, которые входят в библиотеку common-lang3. Именно этот архив можно запускать из командной строки и он будет корректно работать через java -jar, т.к. содержит все необходимые классы внутри себя.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.