-
То есть полноценные экзешники. И как? (если возможно)
-
-
А я в конце концов написал своё :)
Мне нравилось, как Groovy запускает скрипты с анотацией @Grab, но я сильно не взлюбил сам груви. Ну не нравится мне, когда синтаксические ошибки не вылавливаются на этапе компиляции, уж очень дорого стоит поддерживать большие проекты на груви.
Потому я попытался это имитировать на Java. Написал маленький универсальный launcher на java который умеет доставать dependencies из maven repository и запускать приложение. И ещё написал крохотный exe (~20K) на C, который умеет запускать этот launcher. А также shell скрипт, который делает то же самое на Linux.
В деталях всё сложнее. В реальности реализован bootstrap в несколько стадий: - exe или скрипт закачивает launcher jar из Maven repo (или находит его в локальном репо) и запускают его. - launcher умеет только искать/загружать настоящий код который умеет работать с Maven repositories. Вот уже он на самом деле ищет и, если нужно, закачивает приложение и его зависимости. Реально классы (2 класса) в launcher jar для разных приложений совсем не отличаются (если не нужны какие-то оптимизации или нетривиальная логика), а разница только в *.properties файле, который кладётся в тот же jar при сборке. В пропертях указаны необходимые jar, а также класс и метод для запуска приложения. - launcher добавляет все необходимые jar файлы в текуший classpath и запускает main class приложения. Т.е. исполнение приложения происходит в той же Java VM, как будто его запустили обычным образом.
Код умеет искать с нескольких типах локальных репо: Maven (.m2/repository), Groovy (.groovy/grapes), Gradle (.gradle/caches/modules-2/files-2.1), а также свой локальный кеш. В качестве удалёных репо у нас используются Artifactory, но, понятное дело, что будет работать с любым другим Maven repo.
Работает с java8 и java11. Т.е. если компилировать с таргетом java8, то код работает под любой джавой 8+ (это на самом деле нетривиально из-за больших изменений в java 9-11).
В итоге у меня теперь есть технология создания приложений, которые запускаются как exe/shell и загружающие то, что им нужно из Maven repository. Всё строится, собирается и публикуется в Maven repo с помощью Gradle скрипта. CI сделана в GitLab.
Но, к сожалению, пулемёта я вам не дам. Этот код используется внутри компании и вряд ли когда-нибудь дойдут руки и позволят сделать его open source. Хотя всякое может случиться...
-
Alex Konshin © (14.01.19 03:30) [2]
> Но, к сожалению, пулемёта я вам не дам.
Зачем такие сложности? Экзешник из jar-а гораздо проще можно сделать
-
> Alex Konshin © (14.01.19 03:30) [2]
сбербанк?
|