gradle 설치
아래에서 gradle 을 다운로드 하자.Tutorial
Gradle Tutorial : http://www.gradle.org/docs/current/userguide/tutorials.html#N100CE
Gradle 의 Tutorial 을 한 번 해보면 대략적인 사용법을 알 수 있다.
f:\> gradle을 수행하면, gradle 은 기본적으로 build.gradle 이라는 이름의 bulid script 를 찾아서 수행한다.
build.gradle 실행
실행법은 간단하다. 아래처럼 gradle taskName 을 이용하면 그 이름의 task 가 실행된다.
F:\> <gradle_path>/bin/gradle task_name
task hello << {
println 'Hello world!'
}
> gradle -q hello Hello world!
defaultTasks
task_name 을 주지 않고 default task 를 설정할 수 있다.defaultTasks 'hello', 'task1'
task hello << {
println 'Hello world!'
}
위 처럼 여러개의 default task 를 정할 수 있는데, 만약 존재하지 않는 task 이름을 적어넣으면 error 가 발생한다.
Example Source Code
defaultTasks 'hello', 'task1' ///////////////////////////////////////////////////////////////////////////// // task 를 dynamic 하게 만들 수 있다. //////////////////////////////////////// 4.times{ counter -> task "task$counter" << { println "I'm task number $counter" } } ///////////////////////////////////////////////////////////////////////////// // dynamic 하게 만든 task 도 자유롭게 사용할 수 있다. //////////////////////////////////////// task0.dependsOn task2, task3 ///////////////////////////////////////////////////////////////////////////// // dolast 가 여러번 있으면 선언된 순서따라서 action list 에 들어가고 이 순서로 실행된다. //////////////////////////////////////// task1.doFirst{ println "doFirst is done" } task1 << { print "doLast1" } task1.doLast{ print "doLast2" } task1 << { print "doLast3" } ///////////////////////////////////////////////////////////////////////////// task upper << { // << means doLast String something = 'my name' println "Original: " + something println "Upper case: " + something.toUpperCase() } ///////////////////////////////////////////////////////////////////////////// // dependency 추가, "(따옴표) 가 없으면 미리 선언되어 있어야 한다. //////////////////////////////////////// task count(dependsOn: 'hello')<< { 4.times { print "$it" } } count.dependsOn 'hello' ///////////////////////////////////////////////////////////////////////////// // Task 에 property 를 추가할 수 있다. //////////////////////////////////////// task hello { ext.helloProperty = "property 1" } task propertyTest << { println hello.helloProperty }
Java compile 하기
간단하게 java project 를 compile 하는 build script 에 대해 알아 보자.gradle java plugin 사용
비어있는 build.gradle file 을 하나 만들자. 그리고 아래 같이 적자.apply plugin: 'java'
만약 compileJava 를 사용하면 어떻게 될까? 그냥 잘 수행된다. java file 이 없어도 잘 수행된다. 그러면 java file 을 build.gradle 이 있는 곳에 넣고
f:\>gradle compileJava를 실행 해 보자. BUILD SUCCESSFUL 이라고 보이지만, java file 은 compile 된 것 같지가 않다. 왜 안되는 것일까?
Java Project layout
이것은 gradle 이 어느정도 설정을 가정하고 시작하기 때문이다.(convention) 좀 더 정확히 말하면, gradle 은 java 파일이 src/main/java 폴더 안에 있다고 가정하고 compile 을 한다. 그러면, 이번에는src/main/java/Test.java를 넣고 gradle compileJava 를 수행 해 보자. 아래처럼 실제로 compile 이 되고, class 들이 생성된 것을 확인할 수 있다.
이런 layout convention 은 ref.1 에서 확인할 수 있다.
project layout 수정
그러면 어떻게 이 경로를 수정할 수 있을까? 이것도 build script(build.gradle) 에서 수정할 수 있다.sourceSets { main { java { srcDir 'src/java' } resources { srcDir 'src/resources' } } }
Gradle Wrapper
gradle wrapper 란 녀석을 이용하면, gradle 을 자동으로 설치해 준다. 이 gradle wrapper(gradlew) 는 windows batch file 또는 shell script 이다. 이 script 안에 gradle version 이 명시되어 있는데, 명시된 버전을 다운로드 해서 설치 해 준다.그렇기 때문에 gradle wrapper 를 통해 gradle wrapper 를 만들어 놓으면, 이 project 를 다른 곳에 옮겨가서 다시 build 하기 편리하다.
build.gradle 에 아래처럼 적어놓으면 gradle wrapper 를 이용하게 된다. gradleVersion 이 이용하려는 gradle 의 version 이 된다.
task wrapper(type: Wrapper) { gradleVersion = '1.0-milestone-3' }
이렇게 한 후에 gradle wrapper 를 실행 해 주면 된다.
c:\>gradle wrapper그러면 아래와 같은 file 들이 생성된다.
- gradlew
- gradlew.bat
- /gradle/wrapper/gradle-wrapper.jar
- /gradle/wrapper/gradle-wrapper.properties
GradleWrapperMain
gradlew.bat 를 실행하면 gradle-wrapper.jar 의 org.gradle.wrapper.GradleWrapperMain 를 실행시키게 된다. 그러면 GradleWrapperMain 에서 gradle 를 Download 하게 된다.download 가 실행되는 과정은 아래와 같다.
// gradlew.bat @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% // GradleWrapperMain.java public class GradleWrapperMain{ public static void main(String[] args) throws Exception { ... WrapperExecutor wrapperExecutor = WrapperExecutor.forWrapperPropertiesFile(propertiesFile, System.out); wrapperExecutor.execute(args, new Install(new Download("gradlew", wrapperVersion()), new PathAssembler(gradleUserHome)), new BootstrapMainStarter()); } } // WrapperExecutor.java public void execute(String[] args, Install install, BootstrapMainStarter bootstrapMainStarter) throws Exception { File gradleHome = install.createDist(this.config); // Install.java public class Install { ... private final ExclusiveFileAccessManager exclusiveFileAccessManager = new ExclusiveFileAccessManager(120000, 200); // createDist public File createDist(WrapperConfiguration configuration) throws Exception { final URI distributionUrl = configuration.getDistribution(); ... (File)this.exclusiveFileAccessManager.access(localZipFile, new Callable(){ public File call() throws Exception { ... if (needsDownload) { ... Install.this.download.download(distributionUrl, tmpZipFile); ... } ... } ); } ... } // Download.java public void download(URI address, File destination) throws Exception { destination.getParentFile().mkdirs(); downloadInternal(address, destination); } private void downloadInternal(URI address, File destination) throws Exception { ... try { // Download Gradle URL url = address.toURL(); out = new BufferedOutputStream(new FileOutputStream(destination)); URLConnection conn = url.openConnection(); String userAgentValue = calculateUserAgent(); conn.setRequestProperty("User-Agent", userAgentValue); in = conn.getInputStream(); byte[] buffer = new byte[10000]; long progressCounter = 0L; int numRead; while ((numRead = in.read(buffer)) != -1) { progressCounter += numRead; if (progressCounter / 20000L > 0L) { System.out.print("."); progressCounter -= 20000L; } out.write(buffer, 0, numRead); } } finally { ... } }
댓글 없음:
댓글 쓰기