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 package 와 spring-boot : repackage 의 차이점에 대해 논의했습니다 .
또한 Maven 라이프 사이클 의 패키지 단계에서 spring-boot : repackage 를 실행하는 방법을 배웠습니다 .