[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-docker-chto-takoe-layered-jar-v-spring-boot-i-kak-ego-ispolzovat-s-docker":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},716,"chto-takoe-layered-jar-v-spring-boot-i-kak-ego-ispolzovat-s-docker",17,"docker","Docker","🐳","Что такое layered JAR в Spring Boot и как его использовать с Docker?","Layered JAR — это механизм Spring Boot (начиная с версии 2.3), разделяющий JAR-файл на логические слои для оптимизации кэширования Docker-образов при пересборке.\n\nОбычный JAR при каждом изменении кода полностью пересобирается, и Docker не может использовать кэш для зависимостей. Layered JAR разделяет содержимое на слои:\n\n1. `dependencies` — внешние зависимости (меняются редко)\n2. `spring-boot-loader` — загрузчик Spring Boot (почти никогда не меняется)\n3. `snapshot-dependencies` — SNAPSHOT-зависимости (меняются чаще)\n4. `application` — код приложения (меняется при каждой сборке)\n\n### Dockerfile с layered JAR\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```dockerfile\n# Стадия сборки\nFROM maven:3.9-eclipse-temurin-17 AS build\nWORKDIR \u002Fapp\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src .\u002Fsrc\nRUN mvn package -DskipTests -B\n\n# Стадия извлечения слоёв\nFROM eclipse-temurin:17-jre-alpine AS layers\nWORKDIR \u002Fapp\nCOPY --from=build \u002Fapp\u002Ftarget\u002F*.jar app.jar\nRUN java -Djarmode=layertools -jar app.jar extract\n\n# Финальная стадия\nFROM eclipse-temurin:17-jre-alpine\nRUN addgroup -S appgroup && adduser -S appuser -G appgroup\nWORKDIR \u002Fapp\n\n# Копируем слои по отдельности (от редко меняющихся к часто меняющимся)\nCOPY --from=layers \u002Fapp\u002Fdependencies\u002F .\u002F\nCOPY --from=layers \u002Fapp\u002Fspring-boot-loader\u002F .\u002F\nCOPY --from=layers \u002Fapp\u002Fsnapshot-dependencies\u002F .\u002F\nCOPY --from=layers \u002Fapp\u002Fapplication\u002F .\u002F\n\nRUN chown -R appuser:appgroup \u002Fapp\nUSER appuser\nEXPOSE 8080\nENTRYPOINT [\"java\", \"org.springframework.boot.loader.launch.JarLauncher\"]\n```\n\n\u003C\u002Fdetails>\n\n### Преимущество\n\nПри изменении только кода приложения Docker пересобирает лишь последний слой (`application`), а остальные три берутся из кэша. Это значительно ускоряет пересборку образа.\n\n### Включение в pom.xml\n\nДля Spring Boot 2.3+ (в Spring Boot 3.x включён по умолчанию):\n\n```xml\n\u003Cplugin>\n    \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n    \u003CartifactId>spring-boot-maven-plugin\u003C\u002FartifactId>\n    \u003Cconfiguration>\n        \u003Clayers>\n            \u003Cenabled>true\u003C\u002Fenabled>\n        \u003C\u002Flayers>\n    \u003C\u002Fconfiguration>\n\u003C\u002Fplugin>\n```\n\n> **На собеседовании:** layered JAR — это продвинутая оптимизация Docker-сборки для Spring Boot. Объясните проблему: обычный COPY jar пересобирает один большой слой при каждом изменении кода, включая неизменившиеся зависимости. Layered JAR решает это, разделяя JAR на 4 слоя по частоте изменений. Знание этого механизма показывает глубокое понимание Docker + Spring Boot.","","senior",[15,16,17,18,7],"optimization","spring-boot","layered-jar","caching",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Layered JAR в Spring Boot и Docker — Gymterview","Layered JAR (Spring Boot 2.3+) разделяет JAR на 4 слоя для оптимизации кэширования Docker: dependencies, spring-boot-loader, snapshot-dependencies, application.","Layered JAR в Spring Boot: оптимизация Docker-сборки — Gymterview","Layered JAR разделяет Spring Boot JAR на 4 слоя по частоте изменений. При изменении кода пересобирается только последний слой.",[27,28,29,30,31,32,33,34],"layered JAR","Spring Boot Docker","jarmode layertools","Docker кэширование","dependencies слой","JarLauncher","Spring Boot 3","собеседование","Layered JAR (Spring Boot 2.3+, по умолчанию в 3.x) разделяет JAR на 4 слоя: dependencies (меняются редко), spring-boot-loader (почти не меняется), snapshot-dependencies (меняются чаще), application (код, меняется при каждой сборке). В Dockerfile: java -Djarmode=layertools -jar app.jar extract, затем COPY каждый слой отдельно. При изменении только кода Docker пересобирает лишь последний слой, остальные берутся из кэша.",true]