[컴][안드로이드] gradle 사용하기


gradle 설치

아래에서 gradle 을 다운로드 하자.




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'
그러면, 위의 gradle 에서 제공하는 java plugin 의 task 들을 사용할 수 있다. compileJava 부터 clean 등등 을 사용할 수 있다.

만약 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
    {
      ...
    }
}





예제





See Also

  1. Gradle Eclipse plugin
  2. Gradle - 통합 개발 환경 - SLiPP



Reference

  1. http://www.gradle.org/docs/current/userguide/java_plugin.html
  2. Chapter 61. The Gradle Wrapper

댓글 없음:

댓글 쓰기