Maven 프로젝트를 Gradle로 전환하게 된 이유
Maven과 Gradle의 비교

Maven은 Java 전용 프로젝트 관리 도구로, Lifecycle 관리 목적 빌드 도구이며, Apache Ant의 대안으로 만들어졌다.
Maven은 아파치 라이센스로 배포되는 오픈 소스 소프트웨어이다.


Maven을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴이며, Ant Builder와 Groovy script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용가능하며 스프링부트와 안드로이드에서 사용된다.
가독성이 좋다 : 코딩에 의한 간결한 정의가 가능하므로 가독성이 좋다.
재사용에 용이 : 설정 주입 방식(Configuration Injection)을 사용하므로 재사용에 용이하다.
구조적인 장점 : Build Script를 Groovy 기반의 DSL(Domail Specific Language)를 사용하여 코드로서 설정 정보를 구성하므로 구조적인 장점이 있다.
편리함 : Gradle 설치 없이 Gradle wrapper를 이용하여 빌드를 지원한다.
멀티 프로젝트 : Gradle은 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다.
지원: Maven을 완전 지원한다.
gradle을 써야하는이유
1.구글 트렌드 분석 결과

과거에는 maven의 관심도가 상당히 높았으나 점점 gradle에게 따라잡히고있는 모습
2.성능

gradle이 maven의 2배 ~100배 정도 빠름
(gradle은 캐시를 사용하므로 테스트 반복 시 실행 결과 시간의 차이가 더 커진다.)
의존성이 늘어날 수록 스크립트 품질의 차이가 커진다.
Maven은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속 받아야하지만, gradle은 설정 주입 방식을 사용하므로 멀티 프로젝트에 적합하다.
3.스크립트 길이와 가독성 면에서 gradle이 우세하다.

결론 : 사람들이 예전부터 Maven을 사용했기 때문에 maven에 더 익숙할 뿐이지 Maven보다 더 효율적인 Gradle을 사용안할 이유가 없다.
의외로 간단하다
gradle 설치
https://gradle.org/install/
저는 8.5버전을 설치했습니다
project root폴더로 이동
gradle init 실행

maven 파일을 찾았는데 Gradle 파일로 변환할건지 물어봅니다
yes click, pom.xml파일 사라지는것도 아니므로 편하게 눌러줍니다

그나마 익숙한 그루비 선택

새로운 API와 동작을 사용하여 빌드를 생성할 것인지 물어보고 있고,
API 변경이 생겨도 괜찮으면 yes 아니면 no 선택, no 선택해줍니다
1.프로젝트를 빌드할때 실행가능한 jar파일로 추출되지 않는문제
각 프로젝트 gradle.build 파일에
jar {
dependsOn([':vkRest:jar', ':vkDb:jar'])
println 'makeJar'
manifest { attributes 'Main-Class': 'kr.syszone.vk.be.vkapp.Main' }
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
추가
test {
enabled = false
}또는
test.enabled= false
멀티모듈 형식이기 때문에 특정 프로젝트를 빌드할때 선행빌드 되어야 하는 모듈들을 먼저 빌드해줘야 하기 때문에 빌드 순서 조정을 해줬다 + 작업 끝났을때 추가로 해야될 작업 추가
jar {
dependsOn([':vkRest:jar', ':vkDb:jar'])
println 'makeJar'
manifest { attributes 'Main-Class': 'kr.syszone.vk.be.wwd.Main' }
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
tasks.register('buildDockerImage', Exec) {
println 'makeDockerImage'
commandLine 'docker', 'build', '-t', 'vkbe-wwd:1.0.0', '.'
}
jar.finalizedBy buildDockerImage
dependsOn([':vkRest:jar', ':vkDb:jar'])
코드 추가
jar.finalizedBy buildDockerImage코드는
jar작업이 끝나면 도커 이미지까지 빌드하는 커맨드라인수행하게 하는 task 실행 코드 추가