рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рдХрд░рдирд╛

рд╢реБрдн рджреЛрдкрд╣рд░


рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рдбреЙрдХ рдЗрдореЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирдИ рдирд╣реАрдВ рд╣реИ, рдЬрд▓реНрджреА рд╕реЗ рдореБрдЭреЗ Google рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓ рдЧрдП рдФрд░ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдкреИрдХ рдХрд░ рджрд┐рдпрд╛ред рдореБрдЭреЗ jdk11 рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдкрд░ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдФрд░ рдЙрдореНрдореАрдж рдереА рдХрд┐ рд╕реНрд▓рд┐рдо рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдЫрд╡рд┐ рдХреЛ рдбреЙрдХрдЯрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рднреЗрдЬрд╛, рддреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ 422 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдерд╛ред рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдПрдХ рд╡рд░реНрдгрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдФрд░ рдЬрд╛рд╡рд╛ 11 рд╕реЗ 144 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдбреЙрдХ рдХреА рдЫрд╡рд┐ рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд┐рдпрд╛ред



рдЖрд╡реЗрджрди


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореЗрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ (@RepositoryRestResource рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдкрд░ рдПрдХ REST API рдЖрд╡рд░рдг рд╣реИред рдореЗрд░реА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


org.springframework.boot:spring-boot-starter-data-rest org.springframework.boot:spring-boot-starter-data-jpa org.flywaydb:flyway-core org.postgresql:postgresql 

рдПрдХрддреНрд░ рдХреА рдЧрдИ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ 37.6 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╣реИред


Dockerfile:


 FROM openjdk:11-jdk-slim WORKDIR /home/demo ARG REVISION COPY target/spring-boot-app-${REVISION}.jar app.jar ENTRYPOINT ["java","-jar","app.jar"] 

рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рдЖрдХрд╛рд░ рдХреА рдПрдХ рдЫрд╡рд┐ рдорд┐рд▓рддреА рд╣реИ: рдбреЛрдХреНрдЯрд░ рдЗрдореЗрдЬ рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ 422 mbред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЬрдм рдкреБрд░рд╛рдиреА 8-jdk- рд╕реНрд▓рд┐рдо рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдХрд╛рд░ 306 рдПрдордмреА рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рдкреНрд░рдпрд╛рд╕ 1: рдПрдХ рдФрд░ рдореВрд▓ рдЫрд╡рд┐


рдкрд╣рд▓рд╛ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рдЕрдзрд┐рдХ рд╣рд▓реНрдХреЗ рдЪрд┐рддреНрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдерд╛, рдЕрдзрд┐рдорд╛рдирддрдГ рдЕрд▓реНрдкрд╛рдЗрди рдкрд░ рдЖрдзрд╛рд░рд┐рддред рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛:



(11 рд╡рд░реНрддрдорд╛рди рдПрд▓рдЯреАрдПрд╕ рд░рд┐рд▓реАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ 8 рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)


рдЪрд┐рддреНрд░ рдФрд░ рдЯреИрдЧ (~ 2700) рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛, рд▓реЗрдЦрди рдХреЗ рд╕рдордп рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ


рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:


 openjdk 8 488MB openjdk 8-slim 269MB openjdk 8-alpine 105MB openjdk 8-jdk-slim 269MB openjdk 8-jdk-alpine 105MB openjdk 8-jre 246MB openjdk 8-jre-slim 168MB openjdk 8-jre-alpine 84.9MB openjdk 11 604MB openjdk 11-slim 384MB openjdk 11-jdk 604MB openjdk 11-jdk-slim 384MB openjdk 11-jre 479MB openjdk 11-jre-slim 273MB adoptopenjdk/openjdk8 alpine 221MB adoptopenjdk/openjdk8 alpine-slim 89.7MB adoptopenjdk/openjdk8 jre 200MB adoptopenjdk/openjdk8 alpine-jre 121MB adoptopenjdk/openjdk11 alpine 337MB adoptopenjdk/openjdk11 alpine-slim 246MB adoptopenjdk/openjdk11 jre 218MB adoptopenjdk/openjdk11 alpine-jre 140MB 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХреЛ рдЧреЛрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░рддреЗ рд╣реИрдВ / Openjdk11: рдЕрд▓реНрдкрд╛рдЗрди-jre, рддреЛ рдЖрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдХреЛ 177 mb рддрдХ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреНрд░рдпрд╛рд╕ 2: рдХрд╕реНрдЯрдо рд░рдирдЯрд╛рдЗрдо


Jdk9 рдФрд░ рдореЙрдбрд░реНрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рдж рд╕реЗ, рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╡реЗ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдЬреЛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдг рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


 ~/app сРЕ jdeps -s target/app-1.0.0.jar app-1.0.0.jar -> java.base app-1.0.0.jar -> java.logging app-1.0.0.jar -> not found 

рдареАрдХ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ jdeps рд╡рд╕рдВрдд рдмреВрдЯ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП рд╡рд╕рд╛-рдЬрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд╛рд╕рдкрд╛рде рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 ~/app сРЕ jdeps -s -cp target/app-1.0.0/BOOT-INF/lib/*.jar target/app-1.0.0.jar.original Error: byte-buddy-1.9.12.jar is a multi-release jar file but --multi-release option is not set ~/app сРЕ jdeps -s --multi-release 11 -cp target/app-1.0.0/BOOT-INF/lib/*.jar target/app-1.0.0.jar.original Error: aspectjweaver-1.9.2.jar is not a multi-release jar file but --multi-release option is set 

рдЗрд╕ рдЕрд╡рд╕рд░ рдкрд░, рдПрдХ рдмрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦреБрд▓рд╛ рд╣реИ: https://bugs.openjdk.java.net/browse/JDK-8207162


рдореИрдВрдиреЗ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jdk12 рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛:


 Exception in thread "main" com.sun.tools.classfile.Dependencies$ClassFileError ... Caused by: com.sun.tools.classfile.ConstantPool$InvalidEntry: unexpected tag at #1: 53 

ClassNotFoundException рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг, рддреНрд░реБрдЯрд┐ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЦреЛрдЬ рджреНрд╡рд╛рд░рд╛, рдореИрдВрдиреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • java.base
  • java.logging
  • java.sql
  • java.naming
  • java.management
  • java.instrument
  • java.desktop
  • java.security.jgss

рдЙрдирдХреЗ рд▓рд┐рдП рд░реИрдВрдЯрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules java.base,java.logging,java.sql,java.naming,java.management,java.instrument,java.desktop,java.security.jgss --output /usr/lib/jvm/spring-boot-runtime 

рдЖрдЗрдП рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмреЗрд╕рд┐рдХ рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:


 FROM openjdk:11-jdk-slim RUN jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules java.base,java.logging,java.sql,java.naming,java.management,java.instrument,java.desktop,java.security.jgss --output /usr/lib/jvm/spring-boot-runtime FROM debian:stretch-slim COPY --from=0 /usr/lib/jvm/spring-boot-runtime /usr/lib/jvm/spring-boot-runtime RUN ln -s /usr/lib/jvm/spring-boot-runtime/bin/java /usr/bin/java 

рдФрд░ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ:


 docker build . -t spring-boot-runtime:openjdk-11-slim 

рдирддреАрдЬрддрди, рдЖрдХрд╛рд░ 106 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдерд╛, рдЬреЛ рдХрд┐ рдУрдкрдирдЬреЗрдбрдХ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдЖрдзрд╛рд░ рдЪрд┐рддреНрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рдЖрдХрд╛рд░ 144 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╣реЛрдЧрд╛ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо spring-boot-runtime:openjdk-11-slim рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ spring-boot-runtime:openjdk-11-slim рд╕рднреА рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдпрджрд┐ рдЙрдирдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛред рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрд╕реНрдЯреЗрдЬ рдЗрдореЗрдЬ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдЬрд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рджреВрд╕рд░реЗ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред


 FROM openjdk:11-jdk-slim RUN jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules java.base,YOUR_MODULES --output /usr/lib/jvm/spring-boot-runtime FROM debian:stretch-slim COPY --from=0 /usr/lib/jvm/spring-boot-runtime /usr/lib/jvm/spring-boot-runtime WORKDIR /home/demo ARG REVISION COPY target/app-${REVISION}.jar app.jar ENTRYPOINT ["/usr/lib/jvm/spring-boot-runtime/bin/java","-jar","app.jar"] 

рдирд┐рд╖реНрдХрд░реНрд╖


рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЙрдХрд░реЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рдкрд░рддреЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИрдВред Jre рдХреЗ рд╕рд╛рде рдЯреИрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╛ java modularization рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧрд╛ред

Source: https://habr.com/ru/post/hi457476/


All Articles