문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
gradle:from_maven [2012/10/10 11:16] kwon37xi |
gradle:from_maven [2014/06/20 01:18] (현재) kwon37xi [Gradle이 Maven보다 좋았던 점] |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Maven에서 Gradle로 ====== | ====== Maven에서 Gradle로 ====== | ||
+ | |||
+ | ===== Gradle이 Maven보다 좋았던 점 ===== | ||
+ | * 프로젝트 구성과 빌드는 근본적으로 " | ||
+ | * Maven의 가장 큰 문제이며 이로인한 복잡한 프로젝트에서 설정이 거의 불가능한 상황이 자주 발생한다. | ||
+ | * Gradle은 DSL로 설정 정보를 구성하고, | ||
+ | * Maven은 상속 구조를 사용해 멀티 모듈을 구현한다. Gradle은 구성 주입(Configuration Injection)을 사용한다. | ||
+ | * Maven에서 특정 설정을 몇몇 모듈에서만 공통으로 사용하려면 불필요하게 부모 프로젝트를 생성하여 설정하고 그것을 자식들이 상속하게 해야 한다. 게다가 다른 모든게 같더라도 약간이라도 설정이 다른 프로젝트가 하나라도 있다면 그 프로젝트는 상속을 할 수 없고, 거의 모든 설정을 중복해서 해당 프로젝트에 넣어줘야 한다. | ||
+ | * Gradle은 공통 설정을 조건에 따라 특정 프로젝트에만 주입 가능하다. 불필요한 상속 전용 프로젝트는 필요없다. | ||
+ | * 프로젝트에 상대적인 파일 경로로 작업을 할 때 Gradle은 '' | ||
+ | * Maven은 자신만의 플러그인을 만들기가 힘들다. 하지만 Gradle은 '' | ||
+ | * Gradle은 Ant 태스크를 바로 가져다가 사용할 수 있기 때문에 수많은 Java Ant 태스크들을 이미 내장하고 있는 것이나 다름 없다. | ||
+ | * Gradle은 Task간의 작동 순서 정의가 매우 쉽다. Maven은 정적인 특성 때문에 특정 태스크를 반복 수행하거나 하는 등의 작업이 힘들고, 다른 Phase에 태스크를 끼워넣는 것도 직관적이지 못하다. | ||
+ | * Gradle은 Maven플러그인으로는 있으나 Gradle 혹은 Ant 플러그인이 없을 경우 그냥 외부 프로그램을 실행해버리거나 Groovy로 Maven 플러그인의 Java 코드를 호출해서 실행하면 된다. | ||
+ | |||
+ | ===== 현재(1.2) Gradle의 문제점 ===== | ||
+ | * 의존성에서 '' | ||
+ | * Maven보다 프로젝트 컴파일/ 빌드 속도가 느리다. | ||
+ | * 이행적 의존성 충돌이 발생할 때 모르는 사이에 지정한 것보다 높은 버전의 라이브러리를 받아오는 현상이 생긴다. 이것은 문제라기 보다는 Gradle의 의도인데 이것을 이해하지 못하면 의도치 않은 일이 생길 수 있다. [[gradle: | ||
+ | * IDE 지원이 다소 미흡함. 그러나 Eclipse는 대부분 문제가 해결 가능하다. | ||
===== pom.xml에서 의존성 문자열 모두 뽑아내기 ===== | ===== pom.xml에서 의존성 문자열 모두 뽑아내기 ===== | ||
줄 19: | 줄 38: | ||
===== provided ===== | ===== provided ===== | ||
- | 기본적으로 Gradle은 provided를 제공하지 않고 있다. | + | 기본적으로 Gradle은 provided를 제공하지 않고 |
[[http:// | [[http:// | ||
+ | |||
+ | ===== 이행적 의존성으로 인한 라이브러리 버전 변경 대비 ===== | ||
+ | 현재 프로젝트에서 [[http:// | ||
+ | |||
+ | [[gradle: | ||
+ | |||
+ | ===== Profile 흉내내기 ===== | ||
+ | * '' | ||
+ | final String DEFAULT_PROFILE = ' | ||
+ | allprojects { | ||
+ | if (!project.hasProperty(' | ||
+ | ext.profile = DEFAULT_PROFILE | ||
+ | } | ||
+ | |||
+ | // 리소스에 각 프로필별 리소스 디렉토리 추가 | ||
+ | sourceSets { | ||
+ | main { | ||
+ | resources { | ||
+ | srcDir " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * 이제 '' | ||
+ | * '' | ||
===== Apache CXF ===== | ===== Apache CXF ===== | ||
줄 28: | 줄 73: | ||
===== Annotation Processing ===== | ===== Annotation Processing ===== | ||
Annotation Processing은 원칙적으로는 컴파일 과정에서 자동으로 수행된다. | Annotation Processing은 원칙적으로는 컴파일 과정에서 자동으로 수행된다. | ||
- | 하지만 JPA 2 MetaModel 생성같이 소스를 생성해야 할 경우가 있는데 그럴 때는 '' | + | 하지만 JPA 2 MetaModel 생성같이 소스를 생성해야 할 경우가 있는데 그럴 때는 '' |
+ | |||
+ | [[java: | ||
[[gradle: | [[gradle: | ||
- | [[java: | + | ===== projectA의 단위테스트가 projectB의 단위테스트에 의존 ===== |
+ | projectA의 단위테스트가 projectB의 단위테스트에 의존하는 경우가 | ||
+ | |||
+ | [[http:// |