본문 바로가기
공부/Trouble Shooting

Gradle MultiModule 빌드 시 에러

by son_i 2023. 10. 9.
728x90

root 모듈에는 src폴더를 없애고 build.gradle.kts에 모든 프로젝트들에 대한 설정(allprojects), 하위 프로젝트들에 대한 설정(subprojects)를 해주고 새로운 모듈 하나를 만들어주었다.

 

새로운 모듈의 build.gradle.kts는 아래와 같이 비워놓았다.

plugins {}

version = "0.0.1"

dependencies {}

그리고 build하니 오류 발생

➡️원인

main메서드가 없는 모듈을 빌드하려고 할 때 생기는 에러.

main메서드는 서브 모듈인 api에만 존재하고 최상위 root에는 지워서 없다.

 

➡️해결

root module의 build.gradle에 아래 코드를 작성해주면 된다고 했는데 나는 빨간색으로 뜨면서 인식이 안 된다.

bootJar {
    enabled = false
}
jar {
    enabled = true
}

이 코드는 자바로 생성된 build.gradle에 사용하나보다.

 

root의 build.gradle이 아닌 하위 모듈의 build.gradle.kts(:api) 코드 수정

import org.springframework.boot.gradle.tasks.bundling.BootJar

plugins {}

version = "0.0.1"

dependencies {}

val jar: Jar by tasks
val bootJar: BootJar by tasks

bootJar.enabled = false
jar.enabled = true

 

빌드 오류 해결

 

+ 10/13 추가 

모든 모듈들의 build.gradle.kts에 넣어주는게 상당히 번거롭게 느껴졌다.

그러다가 최상위 폴더의 build.gradle.kts에 설정해주는 방법을 찾았다 !

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
	kotlin("jvm") version "1.6.21"
	kotlin("plugin.spring") version "1.6.21" apply false
	kotlin("plugin.jpa") version "1.6.21" apply false

	id("org.springframework.boot") version "2.7.16" apply false
	id("io.spring.dependency-management") version "1.0.15.RELEASE" apply false
}


repositories {
	mavenCentral()
}

allprojects {
	group = "com.zerobase"

	repositories {
		mavenCentral()
	}
}
subprojects {
	apply {
		plugin("org.jetbrains.kotlin.jvm")
		plugin("org.jetbrains.kotlin.plugin.spring")

		plugin("org.springframework.boot")
		plugin("io.spring.dependency-management")
	}

	tasks.withType<KotlinCompile> {
		kotlinOptions {
			freeCompilerArgs = listOf("-Xjsr305=strict")
			jvmTarget = "11"
		}
	}

	tasks.withType<Test> {
		useJUnitPlatform()
	}

	dependencies {
		implementation("org.springframework.boot:spring-boot-starter")
		implementation("org.jetbrains.kotlin:kotlin-reflect")
		implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
		testImplementation("org.springframework.boot:spring-boot-starter-test")
	}
}

project(":api") {
	dependencies {
		implementation(project(":domain"))
	}
}

project(":consumer") {
	dependencies {
		implementation(project(":domain"))
	}
}

project(":domain") {
	val jar: Jar by tasks
	val bootJar: org.springframework.boot.gradle.tasks.bundling.BootJar by tasks

	bootJar.enabled = false
	jar.enabled = true
}

이렇게 각 하위 모듈들을 project로 끌고와서 그 안에 다 넣어주면 된다 !

 

참고

https://junuuu.tistory.com/627