본문 바로가기

Spring

Maven Jar 빌드 외부 dependency 추가

728x90

Spring Webflux로 오브젝트 스토리지 솔루션 프로젝트를 만들면서 빌드 도구는 maven,

배포는 내장 netty 서버 쓸거라서 처음으로 jar로 배포하게 되었다.

한심하다고 느낀건 아직도 나는 maven을 제대로 모른다는 것이다.

시간이 될때 maven에 대해서 공부하고 정리를 해볼 필요를 느꼈다.

 

문제

pom.xml에 외부 jar파일을 추가해서 사용하고 있었는데 로컬에서 실행하면 잘 돌아가지만

jar로 배포해서 실행하면 NoClassDefFoundError가 발생하는 특정 경우가 있었다.

 

원인

pom에서 추가한 외부 jar dependency는 적용이 잘 되었지만, 빌드 후 생성된 jar 파일을 풀어서 BOOT-INF/lib를 보면 

해당 외부 라이브러리가 없었기 때문에 필요한 클래스가 정의되지 않은 것이 원인이었다.

 

* Jar파일은 BOOT-INF/lib 디렉토리에 라이브러리 파일이 있다.

 

pom.xml

<dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-full</artifactId>
    <version>2.8.1</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/oci-java-sdk-full-2.8.1.jar</systemPath>
</dependency>
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

해결

해결 방법은 간단했다.

spring-boot-maven-plugin에 아래 구문을 추가해준다.

<configuration>	
    <includeSystemScope>true</includeSystemScope>
</configuration>

진짜 별거 아니지만 사실 해결하는데 며칠걸려서 화딱지코딱지날뻔

 

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>	
        <includeSystemScope>true</includeSystemScope>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

이렇게 써주면 된다.

728x90