eclipse-wtp
플러그인으로 분리되었다. 따라서, WTP 프로젝트를 생성하려면 eclipse-wtp
플러그인도 적용해야 한다.eclipse-wtp
를 적용하면 eclipse
플러그인은 명시하지 않아도 자동 적용된다.eclipse
프로젝트는 어떤 다른 플러그인이 설정돼 있느냐에 따라 다르게 반응한다.apply plugin: 'eclipse' // 혹은 apply plugin: 'eclipse-wtp'
Eclipse용 Gradle 플러그인을 원한다면
gradle eclipse
를 실행하고서 각 프로젝트를 Eclipse에서 “Existing Projects into Workspace”로 임포트할 수 있다..project
파일이 있을 경우 하위 프로젝트들을 일괄적으로 가져오는 것이 안된다. 이로 인해 각각의 하위 프로젝트를 하나씩 Import 해야한다..project
파일을 일시적으로 삭제하고, 최상위 경로로 일괄 Import를 한 뒤에 다시 .project
파일을 되살려 주면 이 문제를 해결할 수 있다.
현재 (1.2) WTP 프로젝트가 의존하고 있는 일반 Java 프로젝트에도 eclipse-wtp
를 apply하지 않으면 의존 라이브러리를 제대로 배포(Deployment Assembly)에 추가하지 못하는 문제가 있다. /GRADLE-1880 참조.
따라서 eclipse-wtp를 사용하려면 의존관계가 엮이는 모든 프로젝트에 apply plugin: “eclipse-wtp”
를 해줘야 한다.
eclipse
와 cleanEclipse
를 알면 된다.태스크이름 | 의존성 | 타입 | 설명 |
---|---|---|---|
eclipse | eclipse* | Task | 모든 Eclipse 설정 파일을 생성한다. |
cleanEclipse | cleanEclipse* | Delete | 모든 Eclipse 설정을 삭제한다. |
eclipse
태스크 실행전에 다른 태스크를 실행하고자 한다면 eclipseProject
태스크에 의존성을 지정한다. eclipse
태스크에는 의존성 지정이 안 된다.eclipseProject.dependsOn myTaskName
tasks.eclipse.dependsOn myTask
형태로 의존성 지정 된다.모델 | 레퍼런스 이름 | 설명 |
---|---|---|
EclipseModel | eclipse | Eclipse 플러그인의 최상의 요소 |
EclipseProject | eclipse.project | project 정보를 구성한다. |
EclipseClasspath | eclipse.classpath | classpath 정보를 구성한다. |
EclipseJdt | eclipse.jdt | jdt 정보(source/target의 자바 호환성)를 구성한다. |
EclipseWtpComponent | eclipse.wtp.component | eclipse-wtp 플러그인 적용시, wtp 컴포넌트 정보를 구성한다. |
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가 소스 디렉토리로 추가됨 } } }
eclipse { classpath { defaultOutputDir = file("${buildDir}/classes/main") } }
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() }
eclipse { classpath { //default settings for downloading sources and Javadoc: downloadSources = true downloadJavadoc = false } }
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 ... } } }
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이 생성하는 이클립스 파일의 모델링을 하는 객체를 제공해 준다. 파일 생성 라이프사이클은 다음과 같다.
beforeMerged
훅이 설정 파일을 나타내는 도메인 객체를 인자로 실행된다.whenMerged
훅이 설정 파일을 나타내는 도메인 객체를 인자로 실행된다.withXml
훅이 저장될 설정 파일의 XML을 인자로 실행된다.모델 | beforeMerged { arg → } 인자타입 | whenMerged { arg → } 인자타입 | withXml { arg → } 인자타입 |
---|---|---|---|
EclipseProject | Project | Project | XmlProvider |
EclipseClasspath | Classpath | Classpath | XmlProvider |
EclipseJdt | Jdt | Jdt | |
EclipseWtpComponent | WtpComponent | WtpComponent | XmlProvider |
EclipseWtpFacet | WtpFacet | WtpFacet | XmlProvider |
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
훅으로 완전히 생성된 도메인 객체를 관리할 수 있다. 보통 이 방식을 주로 쓴다.
withXmlhook
을 사용하여 메모리에 있는 XML을 디스크에 쓰기 전에 제어할 수 있다. whenMerged
가 좀 더 편하다. 하지만 생성되는 파일에서 모델에 들어가지 않는 부분들에 대한 완전한 제어권을 가질 수 있게 된다.
build.gradle
apply plugin: 'eclipse-wtp' eclipse.wtp.facet.file.withXml { provider -> provider.asNode().fixed.find { it.@facet == 'jst.java' }.@facet = 'jst2.java' }
gradle cleanEclipse eclipse clean
명령을 외부 프로그램으로 등록해준다.