1. 개요

Apache Maven 은 널리 사용되는 프로젝트 의존성 관리 도구 및 프로젝트 빌드 도구입니다.

지난 몇 년 동안 Spring Boot 는 애플리케이션을 빌드하는 데 널리 사용되는 프레임 워크가되었습니다. Apache Maven에서 Spring Boot 지원을 제공 하는 Spring Boot Maven 플러그인 도 있습니다 .

Maven을 사용하여 JAR 또는 WAR 아티팩트에 애플리케이션을 패키징하려는 경우 mvn package를 사용할 수 있습니다 . 그러나 Spring Boot Maven Plugin은 repackage 목표 와 함께 제공되며  mvn 명령에서도 호출됩니다 .

때로는 두 개의 mvn 명령이 혼란 스럽습니다. 이 예제에서는 mvn package  와  spring-boot : repackage 의 차이점에 대해 논의 할 것 입니다.

2. 스프링 부트 애플리케이션 예제

먼저 간단한 Spring Boot 애플리케이션을 예로 들어 보겠습니다.

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

애플리케이션이 실행 중인지 확인하기 위해 간단한 REST 엔드 포인트를 생성 해 보겠습니다.

@RestController
public class DemoRestController {
    @GetMapping(value = "/welcome")
    public ResponseEntity welcomeEndpoint() {
        return ResponseEntity.ok("Welcome to Baeldung Spring Boot Demo!");
    }
}

3. Maven의 패키지 목표

Spring Boot 애플리케이션을 빌드 하려면 spring-boot-starter-web 의존성 만 필요합니다 .

<artifactId>spring-boot-artifacts-2</artifactId>
<packaging>jar</packaging>
...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
...

Maven의  패키지 목표는 컴파일 된 코드를 가져 와서 배포 가능한 형식으로 패키징합니다 .이 경우는 JAR 형식입니다.

$ mvn package
[INFO] Scanning for projects...
[INFO] ------< com.baeldung.spring-boot-modules:spring-boot-artifacts-2 >------
[INFO] Building spring-boot-artifacts-2 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
 ... 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ spring-boot-artifacts-2 ---
[INFO] Building jar: /home/kent ... /target/spring-boot-artifacts-2.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
 ...

실행중인 후 MVN 패키지 명령을, 우리는 내장 된 JAR 파일을 찾을 수 있습니다 스프링 부팅 유물-2.jar  세 이하  대상 디렉토리를. 생성 된 JAR 파일의 내용을 확인해 보겠습니다 .

$ jar tf target/spring-boot-artifacts-2.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/baeldung/
com/baeldung/demo/
application.yml
com/baeldung/demo/DemoApplication.class
com/baeldung/demo/DemoRestController.class
META-INF/maven/...

위의 출력에서 ​​볼 수 있듯이 mvn package 명령으로 생성 된 JAR 파일  에는 프로젝트 소스에서 컴파일 된 Java 클래스와 리소스 만 포함됩니다 .

이 JAR 파일을 다른 프로젝트의 의존성으로 사용할 수 있습니다. 그러나 Spring Boot 애플리케이션이더라도 java -jar JAR_FILE을 사용하여 JAR 파일을 실행할 수 없습니다  . 이는 런타임 의존성이 번들로 제공되지 않기 때문입니다. 예를 들어, 웹 컨텍스트를 시작할 서블릿 컨테이너가 없습니다.

간단한 java -jar 명령을 사용하여 Spring Boot 애플리케이션을 시작하려면  fat JAR 을 빌드해야합니다 . Spring Boot Maven Plugin이 도움이 될 수 있습니다.

4. Spring Boot Maven 플러그인의  리 패키지  목표

이제 spring-boot : repackage무엇을하는지 알아 봅시다  .

4.1. Spring Boot Maven 플러그인 추가

리 패키지 목표 를 실행하려면  pom.xml 에 Spring Boot Maven 플러그인을 추가해야합니다 .

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

4.2. 실행중인 스프링 부팅 : 리 패키지 목표

이제 이전에 빌드 된 JAR 파일을 정리하고 spring-boot : repackage 를 시도해 보겠습니다.

$ mvn clean spring-boot:repackage     
 ...
[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default-cli) @ spring-boot-artifacts-2 ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
...
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default-cli) 
on project spring-boot-artifacts-2: Execution default-cli of goal 
org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:repackage failed: Source file must not be null -> [Help 1]
...

죄송합니다. 작동하지 않습니다. 때문이다 리 패키지 : Spring 부팅이 목표는 소스로 기존 JAR 또는 WAR 아카이브를 받아 프로젝트 수업과 함께 마지막 유물 내부의 모든 프로젝트 런타임 의존성을 재 포장. 이러한 방식으로 재 패키징 된 아티팩트는 java -jar JAR_FILE.jar 명령 줄을 사용하여 실행 가능합니다 .

따라서 spring-boot : repackage 목표 를 실행하기 전에 먼저 JAR 파일을 빌드해야합니다  .

$ mvn clean package spring-boot:repackage
 ...
[INFO] Building spring-boot-artifacts-2 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
 ...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ spring-boot-artifacts-2 ---
[INFO] Building jar: /home/kent/.../target/spring-boot-artifacts-2.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default-cli) @ spring-boot-artifacts-2 ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
 ...

4.3. 재 패키징 된 JAR 파일의 내용

이제  대상 디렉터리를 확인하면 리 패키징 된 JAR 파일과 원본 JAR 파일이 표시됩니다.

$ ls -1 target/*jar*
target/spring-boot-artifacts-2.jar
target/spring-boot-artifacts-2.jar.original

재 패키징 된 JAR 파일의 내용을 확인해 보겠습니다.

$ jar tf target/spring-boot-artifacts-2.jar 
META-INF/
META-INF/MANIFEST.MF
 ...
org/springframework/boot/loader/JarLauncher.class
 ...
BOOT-INF/classes/com/baeldung/demo/
BOOT-INF/classes/application.yml
BOOT-INF/classes/com/baeldung/demo/DemoApplication.class
BOOT-INF/classes/com/baeldung/demo/DemoRestController.class
META-INF/maven/com.baeldung.spring-boot-modules/spring-boot-artifacts-2/pom.xml
META-INF/maven/com.baeldung.spring-boot-modules/spring-boot-artifacts-2/pom.properties
BOOT-INF/lib/
BOOT-INF/lib/spring-boot-starter-web-2.3.3.RELEASE.jar
...
BOOT-INF/lib/spring-boot-starter-tomcat-2.3.3.RELEASE.jar
BOOT-INF/lib/tomcat-embed-core-9.0.37.jar
BOOT-INF/lib/jakarta.el-3.0.3.jar
BOOT-INF/lib/tomcat-embed-websocket-9.0.37.jar
BOOT-INF/lib/spring-web-5.2.8.RELEASE.jar
...
BOOT-INF/lib/httpclient-4.5.12.jar
...

위의 출력을 확인하면 mvn package 명령으로 빌드 된 JAR 파일보다 훨씬 깁니다 .

여기 에서 재 패키징 된 JAR 파일에는 프로젝트에서 컴파일 된 Java 클래스뿐만 아니라 Spring Boot 애플리케이션을 시작하는 데 필요한 모든 런타임 라이브러리가 있습니다 . 예를 들어 임베디드 tomcat 라이브러리는 BOOT-INF / lib  디렉토리에 패키지됩니다 .

다음으로 애플리케이션을 시작하고 작동하는지 확인합니다.

$ java -jar target/spring-boot-artifacts-2.jar 
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

2020-12-22 23:36:32.704  INFO 115154 [main] com.baeldung.demo.DemoApplication      : Starting DemoApplication on YK-Arch with PID 11515...
...
2020-12-22 23:36:34.070  INFO 115154 [main] o.s.b.w.embedded.tomcat.TomcatWebServer: Tomcat started on port(s): 8080 (http) ...
2020-12-22 23:36:34.078  INFO 115154 [main] com.baeldung.demo.DemoApplication      : Started DemoApplication in 1.766 seconds ...

Spring Boot 애플리케이션이 실행 중입니다. 이제 / welcome 엔드 포인트를 호출하여 확인하겠습니다 .

$ curl http://localhost:8080/welcome
Welcome to Baeldung Spring Boot Demo!

큰! 예상되는 응답을 받았습니다. 응용 프로그램이 제대로 실행되고 있습니다.

4.4. Maven의 패키지 수명주기 동안 spring-boot : repackage Goal 실행

Maven 라이프 사이클 패키지 단계 에서 아티팩트를 다시 패키징하도록  pom.xml 에서 Spring Boot Maven 플러그인을 구성 할 수 있습니다  . 즉, mvn 패키지를  실행 하면  spring-boot : repackage 가 자동으로 실행됩니다.

구성은 매우 간단합니다. 실행 요소에 리 패키지 목표를  추가하기 만하면됩니다  .

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

이제 mvn clean 패키지 를 다시 실행 해 보겠습니다 .

$ mvn clean package
 ...
[INFO] Building spring-boot-artifacts-2 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
...
[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default) @ spring-boot-artifacts-2 ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
 ...

출력은 리 패키지 목표가 실행되었음을 보여줍니다. 파일 시스템을 확인하면 리 패키징 된 JAR 파일이 생성되었음을 알 수 있습니다.

$ ls -lh target/*jar*
-rw-r--r-- 1 kent kent  29M Dec 22 23:56 target/spring-boot-artifacts-2.jar
-rw-r--r-- 1 kent kent 3.6K Dec 22 23:56 target/spring-boot-artifacts-2.jar.original

5. 결론

이 기사에서 우리는 mvn packagespring-boot : repackage 의 차이점에 대해 논의했습니다  .

또한 Maven 라이프 사이클 의  패키지 단계에서 spring-boot : repackage 를 실행하는 방법을 배웠습니다  .

항상 그렇듯이이 글의 코드는 GitHub에서 모두 사용할 수 있습니다 .