JAVA

[Gradle] 실행 가능한 JAR 파일 만들기 (with 스프링 멀티 모듈)

코린이s 2021. 4. 17. 10:53
728x90

간단한 프로젝트를 만들어 보겠다!

- 모듈 3개

  • core-util : 공통으로 사용하는 메소드 모듈
  • run-a , run-b: base64로 암호화된 값을 보내면 디코딩 한 후 해당 메세지에 모듈명을 붙인뒤, Base64로 암호화해서 리턴하는 모듈
    • 예) ran-A 모듈에 "코린이" base64 인코딩 하여 요청 > "코린이:run-A" base64 인코딩 한 값 리턴

- 각각 실행 가능한 2개의 Jar 파일 만들기

  • run-a.jar
  • run-b.jar

- 실제 실행해보기

 

만들어보자!

:: github.com/works-code/multi-module

 

works-code/multi-module

multi-module. Contribute to works-code/multi-module development by creating an account on GitHub.

github.com

1. 모듈 만들기 (아래와 같이 3개를 만든다)

- 생성 완료

- 모듈 별 설정은 가장 상위 프로젝트인 multi-module 의 build.gradle, setting.gradle 에서 해줄거라 각 모듈의 build.gradle, setting.gradle 을 주석 처리 한다.

- 가장 상위 프로젝트인 multi-module 의 settings.gradle 에 각 모듈을 정의해준다.

- 가장 상위 프로젝트인 multi-module 의 build.gradle 에 설정을 아래와 같이 한다.

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}
/***
 * 모든 프로젝트 적용 (root 포함)
 */
allprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    group = 'com.code'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '11'


    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }
    // 기본 패키지 스토리지
    repositories {
        mavenCentral()
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }

    test {
        useJUnitPlatform()
    }
}

/***
 * 각각 프로젝트 설정
 */
project(":run-a"){
    // jar 이름 지정
    jar {
        archivesBaseName = 'run-a'
    }
    // 버전별로 jar 생성을 위해 필요 (버전별 관리가 필요함.)
    version '1.0.0-SNAPSHOT'
    dependencies{
        compile project (':core-util')
    }
}
project(":run-b"){
    // jar 이름 지정
    jar {
        archivesBaseName = 'run-b'
    }
    // 버전별로 jar 생성을 위해 필요 (버전별 관리가 필요함.)
    version '1.0.0-SNAPSHOT'
    dependencies{
        compile project (':core-util')
    }
}
project(":core-util"){
    /***
     * compile project dose not exist 오류 해결
     * 외부 프로젝트에서 가져온 클래스를 인식못하는 문제가 있어 아래와 같이 설정
     */
    jar{
        enabled = true
    }
}

- 컨트롤러 정의 (A, B 모듈 동일)

package com.code.controller;

import com.code.utils.CommonUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AController {

    @Value("${module.name}")
    private String moduleName;

    @RequestMapping(value = "/")
    public String start(@RequestParam String text){
        // core-util 메소드 사용
        String decodeTxt = CommonUtils.decodeBase64(text);
        return CommonUtils.encodeBase64(decodeTxt+moduleName);
    }
}

- 테스트

  • RUN-A : helloworld(aGVsbG93b3JsZA==) 를 호출하니 helloworld:run-a(aGVsbG9Xb3JsZDpydW4tYQ==) 를 정상적으로 리턴한다.
  • RUN-B : helloworld(aGVsbG93b3JsZA==) 를 호출하니 helloworld:run-b(aGVsbG93b3JsZDpydW4tYg==) 를 정상적으로 리턴한다.

2. 실행 가능한 jar 파일 만들기

$ cd 프로젝트경로
$ ./gradlew build bootJar -x test // 빌드 + jar 파일 만들기 + 테스트 코드는 제외

3. 실행해보기 

$ java -jar run-a/build/libs/run-a-1.0.0-SNAPSHOT.jar

- 정상적으로 기동됨.

 

728x90