====== Gradle Eclipse Plugin ====== * [[http://www.gradle.org/docs/current/userguide/eclipse_plugin.html|Eclipse Plugin]] * Eclipse 플러그인은 Eclpise IDE 설정 파일을 생성하여, Eclipse로 프로젝트를 import할 수 있도록 한다(File - Import ... - Existing Projects into Workspace). * 외부 의존성과 프로젝트 의존성을 모두 고려하여 설정 파일을 생성한다. * 웹프로젝트는 ''eclipse-wtp'' 플러그인으로 분리되었다. 따라서, WTP 프로젝트를 생성하려면 ''eclipse-wtp'' 플러그인도 적용해야 한다. * ''eclipse-wtp''를 적용하면 ''eclipse'' 플러그인은 명시하지 않아도 자동 적용된다. * ''eclipse'' 프로젝트는 어떤 다른 플러그인이 설정돼 있느냐에 따라 다르게 반응한다. apply plugin: 'eclipse' // 혹은 apply plugin: 'eclipse-wtp' ===== Eclipse용 Gradle Plugin ===== Eclipse용 Gradle 플러그인을 원한다면 * [[gradle:eclipse_buildship|Eclipse Buildship]] : Eclipse 공식 Gradle Plugin Buildship * [[https://github.com/SpringSource/eclipse-integration-gradle/|Eclipse Integration Gradle]]. 잘 작동하는 듯 하며, 이 플러그인 자체가 Gradle Eclipse 플러그인에 의존하고 있는 듯 하다. ===== Multiple Project Import ===== * Gradle Eclipse Plugin으로 멀티 프로젝트를 구성한 뒤에 ''gradle eclipse''를 실행하고서 각 프로젝트를 Eclipse에서 "Existing Projects into Workspace"로 임포트할 수 있다. * 단, 이때 Eclipse 4.2 이하 버전은 최상위 프로젝트에 ''.project'' 파일이 있을 경우 하위 프로젝트들을 일괄적으로 가져오는 것이 안된다. 이로 인해 각각의 하위 프로젝트를 하나씩 Import 해야한다. * 하지만 최상위 프로젝트에서 ''.project'' 파일을 일시적으로 삭제하고, 최상위 경로로 일괄 Import를 한 뒤에 다시 ''.project'' 파일을 되살려 주면 이 문제를 해결할 수 있다. * Eclipse 4.3에서는 이런 과정없이 Multi Project import가 잘 된다. ===== WTP 사용시 중요! ===== 현재 (1.2) WTP 프로젝트가 의존하고 있는 일반 Java 프로젝트에도 ''eclipse-wtp''를 apply하지 않으면 의존 라이브러리를 제대로 배포(Deployment Assembly)에 추가하지 못하는 문제가 있다. [[http://issues.gradle.org/browse/GRADLE-1880|/GRADLE-1880]] 참조. 따라서 eclipse-wtp를 사용하려면 의존관계가 엮이는 모든 프로젝트에 ''apply plugin: "eclipse-wtp"''를 해줘야 한다. ===== 태스크 ===== * 많은 태스크가 있으나 기본적으로 ''eclipse''와 ''cleanEclipse''를 알면 된다. ^태스크이름 ^의존성 ^타입 ^설명 ^ |eclipse | eclipse* | Task | 모든 Eclipse 설정 파일을 생성한다. | |cleanEclipse | cleanEclipse* | [[http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Delete.html|Delete]] | 모든 Eclipse 설정을 삭제한다. | * ''eclipse'' 태스크 실행전에 다른 태스크를 실행하고자 한다면 ''eclipseProject'' 태스크에 의존성을 지정한다. ''eclipse'' 태스크에는 의존성 지정이 안 된다. eclipseProject.dependsOn myTaskName * Gradle 1.5 현재 ''tasks.eclipse.dependsOn myTask'' 형태로 의존성 지정 된다. ===== 설정 ===== * 각 모델을 참조하면 된다. * Eclipse와 다른 Gradle 특징들과의 연동에 관한 예제들이 위키 문서에 퍼져 있다. [[http://wiki.kwonnam.pe.kr/gradle/eclipse?do=backlink|백링크]]로 확인한다. ^모델 ^레퍼런스 이름 ^설명 ^ |[[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseModel.html|EclipseModel]] | eclipse | Eclipse 플러그인의 최상의 요소 | |[[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseProject.html|EclipseProject]] | eclipse.project | project 정보를 구성한다. | |[[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseClasspath.html|EclipseClasspath]] | eclipse.classpath | classpath 정보를 구성한다. | |[[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseJdt.html|EclipseJdt]] | eclipse.jdt | jdt 정보(source/target의 자바 호환성)를 구성한다. | |[[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseWtpComponent.html|EclipseWtpComponent]] | eclipse.wtp.component | ''eclipse-wtp'' 플러그인 적용시, wtp 컴포넌트 정보를 구성한다. | |[[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseWtpFacet.html|EclipseWtpFacet]] | eclipse.wtp.facet | ''eclipse-wtp'' 플러그인 적용시, wtp facet 정보를 구성한다. | * ''eclipse.wtp.component/facet''은 ''war'' 플러그인이 적용된 상태일때만 접근 가능하다. ===== 소스 디렉토리 추가 ===== ''sourceSets''의 ''java''와 ''resources''에 ''srcDir''로 소스 디렉토리를 추가하면 이클립스에서도 자동으로 소스 디렉토리로 만든다. sourceSets { main { resources { srcDir "src/main/resources-appcontext" // resources-appcontext가 소스 디렉토리로 추가됨 } } } ===== Default Output Dir ===== eclipse { classpath { defaultOutputDir = file("${buildDir}/classes/main") } } ==== 테스트 소스 Output Dir 변경 ==== eclipse.classpath.file.whenMerged { cp -> def testSrcs = cp.entries.findAll { it instanceof org.gradle.plugins.ide.eclipse.model.SourceFolder && it.path.startsWith("src/test/") } testSrcs.each { // 멀티 프로젝트에서는 꼭 project.relativePath 로 호출해야 한다. // 안그러면 Root 프로젝트에 대한 상대경로가 지정됨면서 하위 모듈의 프로젝트이름이 이중으로 들어감. it.output = project.relativePath("${buildDir}/classes/test") it.exported = false // Deployment Assembly에서 제외 } // 중복 엔트리 삭제. gradle eclipse를 두 번이상 실행하면 test 관련 디렉토리가 중복 생성된다. cp.entries.unique() } ===== 소스와 Java API Doc 함께 다운로드===== eclipse { classpath { //default settings for downloading sources and Javadoc: downloadSources = true downloadJavadoc = false } } ===== WTP ===== eclipse { wtp { component { contextPath = project.name // 원하는 contextPath 지정. 단, 빈 컨텍스트패스는 '/' 로 지정 } facet { facet name: 'jst.web', version: '2.5' // Servlet Spec Version 지정 facet name: 'jst.java', version: '1.6' // Java Version 지정, 1.7 ... } } } ===== LinkedResources ===== * 프로젝트에 다른 위치의 파일이나 경로를 링크해서 마치 자기 프로젝트의 파일이나 경로처럼 사용할 수 있는 기능. * [[http://www.gradle.org/docs/current/groovydoc/org/gradle/tooling/model/eclipse/EclipseLinkedResource.html|EclipseLinkedResource]]를 참조로 설정한다. * ''type''은 **1**은 파일 **2**는 디렉토리이다. * ''name'', ''type'', ''location*'' 모두 String 타입이다. eclipse { project { linkedResource name: '프로젝트에상대적인경로', type: '1|2, locationUri: 'file://someUri' // URI 기반 linkedResource name: '프로젝트에상대적인경로', type: '1|2', location: '/some/location' // 파일의 절대 경로 기반. } } ===== 생성된 설정파일 커스터마이징 ===== Eclipse 플러그인은 이클립스 설정 메타 데이터 파일을 생성하면서 커스터마이징 할 수 있도록 지원해준다. ==== 병합 ==== 이미 존재하는 이클립스 설정 파일의 부분들은 어떤 부분이냐에 따라 수정 혹은 덮어쓰기의 대상이다. 나머지 부분은 있는 그대로 내버려 둔다. === 무조건 덮어쓰기 === 이클립스 설정 파일을 항상 완전히 덮어 쓰려면 ''gradle cleanEclipse eclipse''를 한다. 간단히 ''tasks.eclipse.dependsOn(cleanEclipse)''로 지정해 놓고 ''gradle eclipse''를 실행해도 된다. 특정 파일별로 덮어 쓰기를 하려면 ''gradle cleanEclipseClasspath eclipseClasspath'' 형태로 각 부분을 명시해 주면 된다. ==== 파일 생성 라이프사이클 후킹 ==== 이클립스 플러그인은 Gradle이 생성하는 이클립스 파일의 모델링을 하는 객체를 제공해 준다. 파일 생성 라이프사이클은 다음과 같다. - 설정 파일을 읽는다, 존재하지 않으면 Gradle이 생성하는 기본 버전을 사용한다. - ''beforeMerged'' 훅이 설정 파일을 나타내는 도메인 객체를 인자로 실행된다. - 이미 존재하는 컨텐츠가 Gradle 빌드에서 생성되었거나 eclipse DSL에서 정의한 설정과 병합된다. - ''whenMerged'' 훅이 설정 파일을 나타내는 도메인 객체를 인자로 실행된다. - ''withXml'' 훅이 저장될 설정 파일의 XML을 인자로 실행된다. - 최종 XML이 저장된다. * 고급 설정 훅 ^모델 ^beforeMerged { arg -> } 인자타입 ^whenMerged { arg -> } 인자타입 ^withXml { arg -> } 인자타입 ^ | [[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseProject.html|EclipseProject]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/Project.html|Project]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/Project.html|Project]] | [[http://www.gradle.org/docs/current/javadoc/org/gradle/api/XmlProvider.html|XmlProvider]] | | [[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseClasspath.html|EclipseClasspath]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/Classpath.html|Classpath]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/Classpath.html|Classpath]] | [[http://www.gradle.org/docs/current/javadoc/org/gradle/api/XmlProvider.html|XmlProvider]] | | [[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseJdt.html|EclipseJdt]] | [[http://www.gradle.org/docs/current/javadoc/org/gradle/plugins/ide/eclipse/model/Jdt.html|Jdt]] | [[http://www.gradle.org/docs/current/javadoc/org/gradle/plugins/ide/eclipse/model/Jdt.html|Jdt]] | | | [[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseWtpComponent.html|EclipseWtpComponent]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/WtpComponent.html|WtpComponent]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/WtpComponent.html|WtpComponent]] | [[http://www.gradle.org/docs/current/javadoc/org/gradle/api/XmlProvider.html|XmlProvider]] | | [[http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseWtpFacet.html|EclipseWtpFacet]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/WtpFacet.html|WtpFacet]] | [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/WtpFacet.html|WtpFacet]] | [[http://www.gradle.org/docs/current/javadoc/org/gradle/api/XmlProvider.html|XmlProvider]] | * ''WtpComponent.wbModuleEntries''는 [[http://gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/WbDependentModule.html|WbDependentModule]],[[http://gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/WbResource.html|WbResource]], [[http://gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/WbProperty.html|WbProperty]], WbSource 등의 객체의 리스트 * ''Classpath.entries''는 [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/ClasspathEntry.html|ClasspathEntry]]를 구현한 [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/Output.html|Output]], [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/SourceFolder.html|SourceFolder]], [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/Container.html|Container]], [[http://www.gradle.org/docs/current/groovydoc/org/gradle/plugins/ide/eclipse/model/Library.html|Library]] 등이다. === 존재하는 컨텐츠의 일부를 덮어쓰기 === ''beforeMerged'' 훅을 사용하여 기존에 존재하는 컨텐츠의 특정 부분만 덮어쓸 수 있다. ''beforeMerged''는 말 그대로 기존에 존재하는 데이터에 대해서만 접근할 수 있다. Gradle이 신규 생성하는 것들에는 접근할 수 없다. * 클래스패스의 일부 의존성 제거 ''build.gradle'' eclipse.classpath.file { beforeMerged { classpath -> classpath.entries.removeAll { entry -> entry.kind == 'lib' || entry.kind == 'var' } } } 그 결과 생성되는 ''.classpath'' 파일은 원본 파일에 있는 의존성 엔트리는 모두 제거하고 Gradle이 생성한 것만 가지게 된다. ''.classpath''의 다른 부분은 그대로 남아서 병합된다. ''.project'' 파일도 마찬가지로 할 수 있다. * ''.project'' 부분 덮어쓰기 ''build.gradle'' eclipse.project.file.beforeMerged { project -> project.natures.clear() } === 완전히 생성된 도메인 객체 수정하기 === ''whenMerged'' 훅으로 완전히 생성된 도메인 객체를 관리할 수 있다. 보통 이 방식을 주로 쓴다. * 의존성 export 변경 ''build.gradle'' eclipse.classpath.file { whenMerged { classpath -> classpath.entries.findAll { entry -> entry.kind == 'lib' }*.exported = false } } === XML 수정하기 === ''withXmlhook''을 사용하여 메모리에 있는 XML을 디스크에 쓰기 전에 제어할 수 있다. ''whenMerged''가 좀 더 편하다. 하지만 생성되는 파일에서 모델에 들어가지 않는 부분들에 대한 완전한 제어권을 가질 수 있게 된다. * XML 수정 ''build.gradle'' apply plugin: 'eclipse-wtp' eclipse.wtp.facet.file.withXml { provider -> provider.asNode().fixed.find { it.@facet == 'jst.java' }.@facet = 'jst2.java' } ===== gradle eclipse 쉽게 실행하기 ===== * **Run -> External Tools -> External Tools Configurations** 에서 * ''gradle cleanEclipse eclipse clean'' 명령을 외부 프로그램으로 등록해준다. * 등록시 **Refresh** 탭에서 "Refresh resources upon completion."을 체크하고 "The entire workspace"를 선택해둔다. "Recursively include sub-folders"도 체크된 상태. * 등록시 **Common** 탭에서 "Display in favorites menu"의 "External Tools"체 체크해둔다. * 이제부터는 gradle 설정이 변경 되었을 때 이 명령만 실행하면 최종적으로 새로고침까지 모두 자동으로 수행된다. ===== target/build 디렉토리 derived로 만들기 ===== * http://forums.gradle.org/gradle/topics/is_it_possible_to_have_gradle_mark_the_build_directory_as_derived_in_eclipse #TODO 테스트 [[http://divinespear.blogspot.kr/2014/04/gradle-eclipse-expert.html|Gradle + Eclipse Expert]] 더 정리