Модифицирует ли spring папку resources

Для сборки sping приложений с помощью gradle в контейнере используется трехступенчатая сборка.

Вопрос вот в чем, создаются ли при сборке spring-приложения какие-то дополнительные файлы или производятся ли модификации файлов в папке resources. Иначе говоря, отличается ли содержимое этой папки в src и в build?

Dockerfile, который я использую:

FROM gradle:latest AS cache

COPY --chown=gradle:gradle ./project /build.gradle /home/gradle/src/build.gradle
RUN mkdir -p /home/gradle/cache_home
ENV GRADLE_USER_HOME /home/gradle/cache_home
WORKDIR /home/gradle/src
RUN gradle clean build -i --stacktrace

FROM gradle:latest AS build

COPY --from=cache /home/gradle/cache_home /home/gradle/.gradle
COPY --chown=gradle:gradle ./project /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle bootJar -i --stacktrace

FROM openjdk:17-jdk-oracle as prod

RUN mkdir /app
RUN mkdir /app/resources
COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar
COPY --from=build /home/gradle/src/build/resources /app/resources
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Dspring.profiles.active=prod", "/app/spring-boot-application.jar"]

Ибо если изменения не производятся, то стадию prod потенциально можно еще ускорить, используя не

COPY --from=build /home/gradle/src/build/resources /app/resources

а используя вместо этого

COPY ./project/path/to/resources /app/resources

При изменении конфигов на текущий момент производится пересборка контейнера в стадии build, хотя кроме конфигов ничего не меняется.

Протестировав на своих контейнерах я не заметил изменений в resources, но хотелось бы быть уверенным, что такой подход в какой-то степени универсален.


Ответы (1 шт):

Автор решения: Темка тоже

производятся ли модификации файлов в папке resources

Если подразумевается src/main/resources, то нет. Ибо это противоречит самой концепции сборки.

Теперь стоит внести ясность в то, куда вообще попадает src/main/resources. Если ты собираешь обычный JAR, то содержимое этой папки попадет в корень jar'ника (jar - это zip-архив), как и скомпилированнные исходники. Но:

  1. Есть генерируемые ресурсы. К примеру файл META-INF/MANIFEST.MF, который может содержать разную служебную информацию, как время сборки.
  2. В процесс сборки могут вмешиваться плагины. Скорее всего у тебя уже включен плагин spring-boot для gradle, который творит свою магию при сборке.

P.S. Меня крайне смущает такая конструкция

COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar
COPY --from=build /home/gradle/src/build/resources /app/resources

Плагин spring-boot'а для gradle должен собирать твоё приложение в один jar'ник. В этом jar'нике уже есть все ресурсы и библиотеки. Т.е. на выходе у тебя должен быть один jar'ник, сделанный по принципу "всё в одном". Однако ты занимаешься копированием библиотек и ресурсов руками.

→ Ссылка