spring / / 2025. 10. 10. 06:37

[Spring Boot 번역] Build

빌드 정보 생성

Maven 플러그인과 Gradle 플러그인 모두 프로젝트의 좌표(coordinates), 이름, 버전을 포함하는 빌드 정보를 생성할 수 있습니다. 플러그인은 또한 설정을 통해 추가 속성을 추가하도록 구성할 수 있습니다. 이러한 파일이 존재하면 Spring Boot는 BuildProperties 빈을 자동으로 구성합니다.

Maven으로 빌드 정보를 생성하려면 다음 예제와 같이 build-info goal에 대한 실행을 추가하세요:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>4.0.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <goals>
                        <goal>build-info</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

자세한 내용은 Spring Boot Maven Plugin documentation을 참조하세요.

다음 예제는 Gradle로 동일한 작업을 수행합니다:

springBoot {
    buildInfo()
}

자세한 내용은 Spring Boot Gradle Plugin documentation을 참조하세요.

Git 정보 생성

Maven과 Gradle 모두 프로젝트가 빌드될 때 git 소스 코드 리포지토리의 상태에 대한 정보를 포함하는 git.properties 파일을 생성할 수 있습니다.

Maven 사용자의 경우, spring-boot-starter-parent POM에는 git.properties 파일을 생성하기 위해 사전 구성된 플러그인이 포함되어 있습니다. 이를 사용하려면 다음과 같이 Git Commit Id Plugin에 대한 선언을 POM에 추가하세요:

<build>
    <plugins>
        <plugin>
            <groupId>io.github.git-commit-id</groupId>
            <artifactId>git-commit-id-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Gradle 사용자는 다음 예제와 같이 gradle-git-properties 플러그인을 사용하여 동일한 결과를 얻을 수 있습니다:

plugins {
    id "com.gorylenko.gradle-git-properties" version "2.4.1"
}

Maven과 Gradle 플러그인 모두 git.properties에 포함되는 속성을 구성할 수 있습니다.

git.properties의 커밋 시간은 다음 형식과 일치해야 합니다: yyyy-MM-dd'T'HH:mm:ssZ. 이것은 위에 나열된 두 플러그인의 기본 형식입니다. 이 형식을 사용하면 시간을 Date로 파싱할 수 있으며, JSON으로 직렬화될 때의 형식이 Jackson의 날짜 직렬화 구성 설정에 의해 제어됩니다.

CycloneDX SBOM 생성

Maven과 Gradle 모두 프로젝트 빌드 시 CycloneDX SBOM을 생성할 수 있습니다.

Maven 사용자의 경우, spring-boot-starter-parent POM에는 SBOM을 생성하기 위해 사전 구성된 플러그인이 포함되어 있습니다. 이를 사용하려면 다음과 같이 cyclonedx-maven-plugin에 대한 선언을 POM에 추가하세요:

<build>
    <plugins>
        <plugin>
            <groupId>org.cyclonedx</groupId>
            <artifactId>cyclonedx-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Gradle 사용자는 다음 예제와 같이 cyclonedx-gradle-plugin 플러그인을 사용하여 동일한 결과를 얻을 수 있습니다:

plugins {
    id 'org.cyclonedx.bom' version '2.3.0'
}

종속성 버전 커스터마이징

spring-boot-dependencies POM은 공통 종속성의 버전을 관리합니다. Maven 및 Gradle용 Spring Boot 플러그인을 사용하면 빌드 속성을 사용하여 이러한 관리되는 종속성 버전을 사용자 지정할 수 있습니다.

각 Spring Boot 릴리스는 특정 타사 종속성 세트에 대해 설계되고 테스트됩니다. 버전을 재정의하면 호환성 문제가 발생할 수 있습니다.

Maven으로 종속성 버전을 재정의하려면 Maven 플러그인 문서의 Using the Plugin을 참조하세요.

Gradle에서 종속성 버전을 재정의하려면 Gradle 플러그인 문서의 Customizing Managed Versions를 참조하세요.

Maven으로 실행 가능한 JAR 생성

spring-boot-maven-plugin은 실행 가능한 "fat" JAR를 만드는 데 사용할 수 있습니다. spring-boot-starter-parent POM을 사용하는 경우 플러그인을 선언하면 JAR가 다음과 같이 재패키징됩니다:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

parent POM을 사용하지 않는 경우에도 플러그인을 사용할 수 있습니다. 그러나 다음과 같이 <executions> 섹션을 추가로 추가해야 합니다:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>4.0.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

전체 사용 세부 정보는 plugin documentation을 참조하세요.

Spring Boot 애플리케이션을 종속성으로 사용

war 파일과 마찬가지로 Spring Boot 애플리케이션은 종속성으로 사용하도록 의도되지 않았습니다. 애플리케이션에 다른 프로젝트와 공유하려는 클래스가 포함되어 있는 경우 권장되는 접근 방식은 해당 코드를 별도의 모듈로 이동하는 것입니다. 그러면 별도의 모듈이 애플리케이션 및 다른 프로젝트의 종속성이 될 수 있습니다.

위에서 권장한 대로 코드를 재구성할 수 없는 경우 Spring Boot의 Maven 및 Gradle 플러그인은 종속성으로 사용하기에 적합한 별도의 아티팩트를 생성하도록 구성해야 합니다. executable jar format이 애플리케이션 클래스를 BOOT-INF/classes에 패키징하기 때문에 실행 가능한 아카이브는 종속성으로 사용할 수 없습니다. 이는 실행 가능한 jar가 종속성으로 사용될 때 찾을 수 없음을 의미합니다.

종속성으로 사용할 수 있는 아티팩트 하나와 실행 가능한 아티팩트 하나를 생성하려면 classifier를 지정해야 합니다. 이 classifier는 실행 가능한 아카이브의 이름에 적용되어 기본 아카이브를 종속성으로 사용할 수 있도록 남겨둡니다.

Maven에서 exec의 classifier를 구성하려면 다음 구성을 사용할 수 있습니다:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

실행 가능한 Jar가 실행될 때 특정 라이브러리 추출

실행 가능한 jar의 대부분의 중첩된 라이브러리는 실행하기 위해 압축 해제할 필요가 없습니다. 그러나 특정 라이브러리는 문제가 있을 수 있습니다. 예를 들어, JRuby는 jruby-complete.jar가 항상 그 자체로 파일로 직접 사용 가능하다고 가정하는 자체 중첩 jar 지원을 포함합니다.

문제가 있는 라이브러리를 처리하려면 실행 가능한 jar가 처음 실행될 때 특정 중첩 jar가 자동으로 압축 해제되도록 플래그를 지정할 수 있습니다. 이러한 중첩 jar는 java.io.tmpdir 시스템 속성으로 식별되는 임시 디렉토리 아래에 기록됩니다.

애플리케이션이 실행되는 동안 운영 체제가 임시 디렉토리에 압축 해제된 jar를 삭제하지 않도록 구성되어 있는지 확인해야 합니다.

예를 들어, Maven 플러그인을 사용하여 JRuby가 압축 해제되도록 플래그를 지정하려면 다음 구성을 추가합니다:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <requiresUnpack>
                    <dependency>
                        <groupId>org.jruby</groupId>
                        <artifactId>jruby-complete</artifactId>
                    </dependency>
                </requiresUnpack>
            </configuration>
        </plugin>
    </plugins>
</build>

제외가 있는 실행 불가능한 JAR 생성

종종 실행 가능한 jar와 실행 불가능한 jar를 두 개의 별도 빌드 제품으로 가지고 있는 경우, 실행 가능한 버전에는 라이브러리 jar에 필요하지 않은 추가 구성 파일이 있습니다. 예를 들어, application.yaml 구성 파일은 실행 불가능한 JAR에서 제외될 수 있습니다.

Maven에서 실행 가능한 jar는 주 아티팩트여야 하며 다음과 같이 라이브러리에 대한 classified jar를 추가할 수 있습니다:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <id>lib</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classifier>lib</classifier>
                        <excludes>
                            <exclude>application.yaml</exclude>
                        </excludes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Maven으로 시작한 Spring Boot 애플리케이션 원격 디버깅

Maven으로 시작한 Spring Boot 애플리케이션에 원격 디버거를 연결하려면 maven pluginjvmArguments 속성을 사용할 수 있습니다.

자세한 내용은 this example을 참조하세요.

spring-boot-antlib를 사용하지 않고 Ant로 실행 가능한 아카이브 빌드

Ant로 빌드하려면 종속성을 가져오고, 컴파일한 다음, jar 또는 war 아카이브를 생성해야 합니다. 실행 가능하게 만들려면 spring-boot-antlib 모듈을 사용하거나 다음 지침을 따를 수 있습니다:

  1. jar를 빌드하는 경우 애플리케이션의 클래스와 리소스를 중첩된 BOOT-INF/classes 디렉토리에 패키징하세요. war를 빌드하는 경우 평소와 같이 애플리케이션의 클래스를 중첩된 WEB-INF/classes 디렉토리에 패키징하세요.

  2. jar의 경우 중첩된 BOOT-INF/lib 디렉토리에, war의 경우 WEB-INF/lib에 런타임 종속성을 추가하세요. 아카이브의 항목을 압축하지 않도록 기억하세요.

  3. jar의 경우 중첩된 BOOT-INF/lib 디렉토리에, war의 경우 WEB-INF/lib-providedprovided(임베디드 컨테이너) 종속성을 추가하세요. 아카이브의 항목을 압축하지 않도록 기억하세요.

  4. 아카이브의 루트에 spring-boot-loader 클래스를 추가하세요(Main-Class를 사용할 수 있도록).

  5. 적절한 런처(예: jar 파일의 경우 JarLauncher)를 매니페스트의 Main-Class 속성으로 사용하고 필요한 다른 속성을 매니페스트 항목으로 지정하세요 — 주로 Start-Class 속성을 설정하여.

다음 예제는 Ant로 실행 가능한 아카이브를 빌드하는 방법을 보여줍니다:

<target name="build" depends="compile">
    <jar destfile="target/${ant.project.name}-${spring-boot.version}.jar" compress="false">
        <mappedresources>
            <fileset dir="target/classes" />
            <globmapper from="*" to="BOOT-INF/classes/*" />
        </mappedresources>
        <mappedresources>
            <fileset dir="src/main/resources" erroronmissingdir="false" />
            <globmapper from="*" to="BOOT-INF/classes/*" />
        </mappedresources>
        <mappedresources>
            <fileset dir="${lib.dir}/runtime" />
            <globmapper from="*" to="BOOT-INF/lib/*" />
        </mappedresources>
        <zipfileset src="${lib.dir}/loader/spring-boot-loader-jar-${spring-boot.version}.jar" />
        <manifest>
            <attribute name="Main-Class" value="org.springframework.boot.loader.launch.JarLauncher" />
            <attribute name="Start-Class" value="${start-class}" />
        </manifest>
    </jar>
</target>

출처: https://docs.spring.io/spring-boot/4.0-SNAPSHOT/how-to/build.html

참고: 이 문서는 Spring Boot 4.0.0-SNAPSHOT 버전의 문서로, 아직 개발 중이며 안정적인 버전이 아닙니다. 최신 안정 버전은 Spring Boot 3.5.6을 사용하세요.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유