관리 메뉴

너와 나의 스토리

[Gradle] Multi Project 설정하기 (build.gradle 분리하기) 본문

개발/Spring Boot

[Gradle] Multi Project 설정하기 (build.gradle 분리하기)

노는게제일좋아! 2021. 4. 1. 12:47
반응형

1. settings.gradle에 최상위 프로젝트와 하위 프로젝트 설정

  • rootProject.name = '프로젝트 이름'
  • include = '하위 프로젝트', '하위 프로젝트', ...

 

2. 최상위 프로젝트의 build.gradle에 모든 서브 프로젝트에 공통된 설정을 넣는다.

  • dependency-management를 통한 의존성 관리
    • 아래의 코드처럼 dependency-management를 적용시키면 Spring Boot Gradle Plugin이 Spring Boot 버전에 따라서 의존성을 자동으로 관리해준다.

    dependencyManagement {
        dependencies {

            dependencySet(group: 'org.springframework.boot', version: spring_boot_version) {
                entry 'spring-boot'
                entry 'spring-boot-test'
				...
            }

            dependencySet(group: 'io.springfox', version: swagger_version) {
                entry 'springfox-swagger-ui'
                entry 'springfox-swagger2'
            }

         	...
        }
    }

 

3. dependency 설정

  • 아래 코드처럼 버전을 적지 않고 dependency를 작성해 놓아도, dependency-management 플러그인이 현재 사용하는 스프링 부트 버전에 해당하는 버전들을 자동으로 가져와 적용한다.
	dependencies {
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'

        implementation(
                'javax.persistence:javax.persistence-api',
                'org.springframework.boot:spring-boot-starter-web',
                'org.springframework.boot:spring-boot-starter-thymeleaf',
                'io.springfox:springfox-swagger2',
                'io.springfox:springfox-swagger-ui'
        )

        ...
    }

 

<전체 코드 예시>

buildscript {
    ext {
        spring_boot_version = '2.4.3'
        h2_version = '1.4.200'
		...
    }
    repositories {
        mavenCentral()
		...
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${spring_boot_version}")
        ...
    }
}

// default config
allprojects {
    apply plugin: 'idea'
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    jar {
        archiveBaseName.set("${rootProject.name}-${project.name}")
    }

    task sourceJar(type: Jar) {
        from sourceSets.main.allSource
        archiveBaseName.set("${rootProject.name}-${project.name}")
    }

    group = 'com.***.***'
    version = '0.0.1'

    sourceCompatibility = 1.8

    repositories {
        mavenCentral()
		...
    }
}

subprojects {
    apply plugin: 'io.spring.dependency-management'

    dependencyManagement {
        dependencies {

            dependencySet(group: 'org.springframework.boot', version: spring_boot_version) {
                entry 'spring-boot'
                entry 'spring-boot-test'
				...
            }

            dependencySet(group: 'io.springfox', version: swagger_version) {
                entry 'springfox-swagger-ui'
                entry 'springfox-swagger2'
            }

         	...
        }
    }

    dependencies {
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'

        implementation(
                'javax.persistence:javax.persistence-api',
                'org.springframework.boot:spring-boot-starter-web',
                'org.springframework.boot:spring-boot-starter-thymeleaf',
                'io.springfox:springfox-swagger2',
                'io.springfox:springfox-swagger-ui'
        )

        ...
    }

}

configurations.all {
    resolutionStrategy {
        // don't cache changing modules at all
        cacheChangingModulesFor 0, 'seconds'
    }
}
}
  • subprojects: settings.gradle에 include된 프로젝트 전부를 관리
  • dependenceManagement에서 작성된 entry에 적합한 버전을 주입해줌(스프링 버전은 입력되어 있으니 거기에 맞게)
  • 하단의 dependencies에는 "version"을 지정하지 않고 사용할 의존성들을 선언함. 
    • 위의 dependencyManagement에 선언함으로써 버전 설정 자동으로 됨

 

4. 서브 프로젝트에 build.gradle 설정

  • 해당 프로젝트(서브 프로젝트)에서 사용하는 의존성만 설정해주면 된다.
dependencies {
    runtimeOnly(
            'org.springframework.boot:spring-boot-starter-web',
            'com.h2database:h2'
    )
    
    ...
}

 

 

* 참고 자료: 

The usage of classifiers in the dependencyManagement plugin is not supported since Gradle does not provide an API for the plugin to access the classifier. Therefore, dependency versions with classifiers cannot be specified in the dependencyManagement section either directly using dependency or as a group using dependencySet.

 

 

 

 

참고:

- stackoverflow.com/questions/65582771/is-it-possible-to-set-a-dependencyset-entrys-classifier-using-springs-gradle-d

- docs.gradle.org/current/userguide/declaring_dependencies.html
- docs.spring.io/dependency-management-plugin/docs/current/reference/html/

반응형
Comments