Jihoon's IT Development

Web Developer's Hobby Development Notes

Maven으로 Spring boot 배포 시 repackge 방지

개요

다른 프로젝트에서 Spring Boot Application 의 jar를 참조하여 사용하기 위해서는 Maven Deploy시 실행 가능한 jar가 아닌 Original jar 가 배포 되어야 함.

Spring Boot Maven Plugin

Maven을 이용하여 Spring Boot Application을 빌드 할 경우 특별한 경우가 아니라면 Spring Boot Maven Plugin을 활용하게 될겁니다. Spring Boot Maven Plugin은 아래와 같은 몇가지 기능을 제공합니다.

  • repackage : 자동 실행 가능한 jar 또는 war 파일을 만듭니다.
  • run : Spring Boot Application이 매개변수를 전달하는 여러가지 옵션과 함께 실행됩니다.
  • start and stop : Application 이 시작되기 전 integration-test 단계를 수행할 수 있습니다.
  • build-info : Actuator가 사용할 수있는 빌드 정보를 생성합니다.

이 중 이번에 살펴볼 부분은 repackage 입니다.

Repackaging an application

간단한 예제 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<build>
...
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>

repackage는 Maven 수명주기의 package 단계에서 빌드 된 jar 또는 war를 다시 패키지(repackage)합니다. Plugin은 Application을 repackage 하면서 프로젝트의 dependency를 참고하여 필요한(종속된) 라이브러리를 포함시킵니다. 때문에 용량이 매우 크죠. repackage 되기 전 jar 또는 war 는 .original 확장자가 추가로 붙어 보존 됩니다.

실행 가능한 jar는 빌드 및 테스트시에 매우 유용합니다. 독립 실행이 가능하기 때문에 배포 역시 편리해지지요. 하지만 Application의 코드가 다른 프로젝트에서 사용되어야 한다면 어떨까요. 이런경우 다른 팀원과 공유해야 할 경우에 jar.original 파일을 건네주는 것은 의미가 없습니다.(다른 팀원도 Maven을 사용하고 있을테니까요.)

우리는 jar.original 파일을 사내 Maven Repository에 배포해야 합니다.

Deploy Maven Repository

여기서 사내 Maven Repository에 접근하기위한 Maven의 settings.xml 파일 설정 등의 설명은 하지 않겠습니다. 모든 설정이 잘 되어있다고 가정했을 경우 일반적인 배포 명령어는 아래와 같습니다.

1
mvn clean deploy

이제 pom.xml 에 dependency 설정만 해주면 되겠군요!

하지만 다른 팀원의 pom.xml에 정상적으로 dependency 설정을 완료하더라도 Class를 찾을 수 없다는 에러가 발생합니다. 이유는 간단합니다. original jar가 아닌 실행가능한 jar가 배포되었기 때문이죠.

실행가능한 jar(혹은 war)는 아래의 디렉토리 구조에서 알 수 있듯 jar.original과 다른 구조를 가지게 되며, dependency에 선언되더라도 Class를 찾을 수 없습니다.

또한, 실행이 되더라도 배포하기에는 너무나 거대한 용량을 가지게 되죠. 다른 팀원에게 제공되어야 하는 jar 는 실행이 가능하도록 repackage 되기 전의 결과물인 original jar 입니다.

Spring Boot Maven Plugin:repackage

모든일의 원흉(?)이라고 할 수 있는 Spring Boot Maven Pluginrepackage 문서를 살펴봅시다. Optional Parameters에 흥미로운 파라미터가 보입니다. 바로 skip이죠.

  • skip
    • Skip the execution.
    • Type: boolean
    • Since: 1.2.0
    • Required: No
    • User Property: spring-boot.repackage.skip
    • Default: false

실행을 Skip 할 수 있다는 군요. 해결책을 찾은 것 같습니다.

결론

Maven Deploy 시 Original jar 를 배포하기 위한 명령어는 다음과 같습니다.

1
mvn clean deploy -Dspring-boot.repackage.skip=true

참고 : https://docs.spring.io/spring-boot/docs/current/maven-plugin/repackage-mojo.html