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
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