Spring

Spring boot 2.5 이상 docker를 위한 unpack

빠빠담 2021. 7. 17. 15:32
반응형
task moveLib {
    doLast {
        def unpackDir = "$buildDir/unpack"
        ant.move(file: "${unpackDir}/app/BOOT-INF/lib", toFile: "${unpackDir}/lib")
    }
}

task unpackJar(type: Copy) {
    def unpackDir = "$buildDir/unpack"

    delete unpackDir
    from zipTree(jar.getArchiveFile())
    into "$unpackDir/app"

    finalizedBy moveLib
}

build {
    finalizedBy unpackJar
}

도커의 계층구로로 라이브러리와 소스코드를 분리하여 도커 이미지를 빌드하는 build.gradle 코드이다

뒤에서 해당 소스를 A-1 이라 부르도록 하겠다.

 

 

스프링 부트 버전 2.5 부터 build시 위와 같이 plain.jar 파일이 같이 생성된다.

 

IMG-1

위 이미지와 같이 plain.jar는 디펜던시 라이브러리들과 스프링 소스들을 모두 빼고 내가 작성한 소스코드 들만 포함된 jar 파일인 것을 확인할 수 있다.

Execution failed for task ':moveLib'.
> Warning: Could not find file C:\workspace\DOWHAT\spring\dowhat-cloud\config-service\build\unpack\app\BOOT-INF\lib to copy.

이 상황에서 A-1 코드를 그대로 사용하면 위와 같은 에러를 볼 수 있을 것이다.

 

    from zipTree(jar.getArchiveFile())

문제는 해당 부분에서 발생하는데 jar가 가리키는 파일이 plain.jar 이기 때문이다.

 

ant.move(file: "${unpackDir}/app/BOOT-INF/lib", toFile: "${unpackDir}/lib")

IMG-1 이미지를 보면 plain.jar에는 라이브러리 파일이 존재하지 않는데 라이브러리 파일을 복사하라고 하니 

Could not find file 파일을 찾을 수 없다고 에러를 던지는 것이다.

 

task moveLib {
    doLast {
        def unpackDir = "$buildDir/unpack"
        ant.move(file: "${unpackDir}/app/BOOT-INF/lib", toFile: "${unpackDir}/lib")
    }
}

task unpackJar(type: Copy) {
    def unpackDir = "$buildDir/unpack"
    def jarFile = "$buildDir/libs/${rootProject.name}-${version}.jar"

    delete unpackDir
    from zipTree(jarFile)
    into "$unpackDir/app"

    finalizedBy moveLib
}

build {
    finalizedBy unpackJar
}

나는 plain.jar가 아닌 기존의 jar 파일을 바라보게 하도록 위와 같이 설정하였다.

 

def jarFile = "$buildDir/libs/${rootProject.name}-${version}.jar"

기존의 jar 파일을 바라보게 해당 jar파일 경로를 선언해주고

 

from zipTree(jarFile)

해당 jar 파일을 참조하도록 설정하였다.

 

마지막으로 plain.jar 가 필요 없다면 build.gradle 에 아래와 같이 설정하면 plain.jar 없이 빌드 될것이다.

jar {
    enabled = false
}

문서는 아래를 참고 하도록 하자

https://docs.spring.io/spring-boot/docs/2.5.0/gradle-plugin/reference/htmlsingle/#packaging-executable.and-plain-archives

 

Spring Boot Gradle Plugin Reference Guide

To manage dependencies in your Spring Boot application, you can either apply the io.spring.dependency-management plugin or use Gradle’s native bom support. The primary benefit of the former is that it offers property-based customization of managed versio

docs.spring.io

 

 

반응형

'Spring' 카테고리의 다른 글

QueryDsl with Lombok  (0) 2021.08.05
Zipkin - Docker MySQL  (0) 2021.07.25
Mapstruct & Lombok 적용  (3) 2021.04.16
스프링 멀티 모듈 적용  (0) 2021.03.15
[Jpa] ddl-auto: create 시 foreign key 제거  (0) 2020.11.17