- PVSM.RU - https://www.pvsm.ru -
TLTD
Детали и результат под катом.
Веб сервис на java, который отдает наружу rest api и websockets, а внутри умеет ходить в распределенную бд и распределенный кеш.
Проект использует embedded jetty для старта, запускается через public status void method
.
Доставляется на сервер в виде fat jar и запускается через java -jar myapp.jar app.yaml
Gradle отличный иструмент, который из коробки дает профайлер. Запустим билд с параметром --profile
и подождем результат.
./gradlew clean build --profile
Думаю, результат в комментировании не нуждается:
Первым делом я решил посмотреть как сейчас создается fat jar:
jar {
manifest {
attributes "Main-Class": "com.baeldung.fatjar.Application"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Прописываем в манифесте класс с main методом и распаковываем jar dependencies в корневую папку jar архива.
Это можно проверить, если сделать распаковав jar unzip myapp.jar
и посмотреть дерево текущией папки tree .
Неудивительно, что это медленно, много мелких файлов нужно сначало распаковать, а потом обратно запаковать.
Далее, я попровал нагуглить более быстрый вариант создания jar файла.
Я попробовал плагины для gradle:
gradle-fatjar-plugin [1] — больше не поддерживается
shadow [2] — удалось собрать им, но он использует тот же способ, как и выше, поэтому это не дало прироста в скорости
gradle-one-jar [3] — вообще не смог запустить, честно скажу, возможно нужно было просто потратить больше времени
Тут мне пришла идея, даже можно сказать вызов. А как запустить приложения без jar? У меня как раз был распакованных архив, для того, чтобы попробовать это.
Оказалось не сложно:
java -cp . com.example.Main app.yml
Проект отлично запустился, подхватил нужный конфиг.
Параметр -cp это classpath, который говорит java процессу, где лежат все классы проекта.
Получается, проект может жить без jar? Воспользовавшись небольшой помощью [4] gradle community, я получил таск, который создает exploded версию jar:
task explodedJar(type: Copy) {
with jar
into "${buildDir}/exploded"
into('lib') {
from configurations.runtimeClasspath
}
}
jar.enabled = false
assemble.dependsOn explodedJar
Таск
exploded
папкуЗапускаем еще раз
./gradlew build --profile
Думаю, комментарии тут опять не нужны.
Тут возможно еще стоит продублировать гистограмму из начала статьи, но я этого делать не буду.
Чтобы не делать эту статью очень длинной, просто оставлю одну команду для копирования проекта на сервер:
rsync --delete -r build/exploded api.example.com:/opt/myapp
jar
build/exploded
Автор: pull
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/275734
Ссылки в тексте:
[1] gradle-fatjar-plugin: https://github.com/musketyr/gradle-fatjar-plugin
[2] shadow: https://github.com/johnrengelman/shadow
[3] gradle-one-jar: https://github.com/rholder/gradle-one-jar
[4] помощью: https://discuss.gradle.org/t/how-to-put-all-build-files-to-one-folder/26292
[5] Источник: http://habrahabr.ru/sandbox/114748/
Нажмите здесь для печати.