혼자서 연습해본 Gradle 4.1 튜토리얼 - 그야 말로 대충 번역!

Creating New Gradle Builds

처음으로 Gradle을 사용하는 프로젝트를 접했을 때, 많은 개발자들은 Gradle이 무엇을 할 수 있는지(혹은 뭘 어쩌라는 건지) 알지 못합니다. 이 가이드의 목적은 프로젝트의 유형에 관계없이 모든 Gradle 빌드에서 작동하는 몇 가지 기본 태스크(task, 작업)을 보여주는 것입니다. 이 가이드에서는 간단한 Gradle 프로젝트를 만들고 기본 Gradle 명령을 호출하며 Gradle이 프로젝트를 관리하는 방법에 대해 설명합니다.

필요한 것

  • JDK(>=8)
  • Gradle(>=4.0)

새로운 프로젝트 만들기

폴더(디렉토리?)를 하나 만들고, 내용이 없는 build.gradle 파일을 생성합니다.

$ mkdir basic-demo
$ cd basic-demo
$ touch build.gradle 

tasks 명령어 실행하기

Gradle은 프로젝트를 위한 범용 빌드 도구입니다. Gradle 자체는 객체 지향 API를 기반으로 합니다. 객체 지향 API는 다양한 클래스와 메소드로 구성되며 간단한 구문을 사용하여 구성됩니다. 빌드 파일 자체는 org.gradle.api.Project 클래스의 인스턴스를 구성합니다. 이 클래스에는 많은 기본 제공 속성 및 메서드가 있습니다. 프로젝트에서 모든 Gradle의 기능에 액세스 할 수 있습니다.

기본적으로 빌드 파일의 이름은 build.gradle입니다.

비어있는 프로젝트에서도 사용할 수 있는 태스크 목록(tasks)을 보려면 명령 프롬프트에서 tasks 명령을 실행하십시오.

$ gradle tasks

> Task :tasks

------------------------------------------------------------
All tasks runnable from root project  
------------------------------------------------------------

Build Setup tasks  
-----------------
init - Initializes a new Gradle build.  
wrapper - Generates Gradle wrapper files.

Help tasks  
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle-empty'.  
components - Displays the components produced by root project 'gradle-empty'. [incubating]  
dependencies - Displays all dependencies declared in root project 'gradle-empty'.  
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-empty'.  
dependentComponents - Displays the dependent components of components in root project 'gradle-empty'. [incubating]  
help - Displays a help message.  
model - Displays the configuration model of root project 'gradle-empty'. [incubating]  
projects - Displays the sub-projects of root project 'gradle-empty'.  
properties - Displays the properties of root project 'gradle-empty'.  
tasks - Displays the tasks runnable from root project 'gradle-empty'.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>


BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

출력물이 보여 주듯이, Gradle 태스크는 Build Setup 또는 Help와 같은 카테고리로 구성되며 각 태스크에는 이름과 설명이 있습니다. 자신만의 태스크를 정의하거나, Gradle 라이브러리가 제공하는 태스크를 구성하거나, 플러그인에 의해 추가 된 태스크를 사용할 수 있습니다.

Gradle wrapper 생성하기

래퍼(Wrapper)는 사용자가 Gradle이 설치되어 있지 않아도 Gradle 태스크를 실행할 수 있도록 해주는 작은 스크립트(script), jar 및 등록 정보 파일입니다. 래퍼를 생성하면 사용자가 프로젝트를 만든 사람과 동일한 버전의 Gradle을 사용할 수 있습니다.

Gradle 버전은 이전 버전과의 호환성을 지원하는 데 매우 뛰어나지만 래퍼를 사용하면 사용자가 프로젝트 작성자가 지원하는 Gradle 버전을 사용하고 있으므로 올바른 방법으로 간주됩니다.

래퍼 태스크에 대한 세부 사항은 도움말 태스크를 통해 볼 수 있습니다.

 $ gradle help --task wrapper

> Task :help
Detailed task information for wrapper

Path  
     :wrapper

Type  
     Wrapper (org.gradle.api.tasks.wrapper.Wrapper)

Options  
     --distribution-type     The type of the Gradle distribution to be used by the wrapper.
                             Available values are:
                                  ALL
                                  BIN

     --gradle-distribution-url     The URL to download the Gradle distribution from.

     --gradle-version     The version of the Gradle distribution required by the wrapper.

Description  
     Generates Gradle wrapper files.

Group  
     Build Setup


BUILD SUCCESSFUL in 1s  
1 actionable task: 1 executed  

기본적으로 래퍼 태스크는 Gradle 명령과 동일한 버전의 바이너리 배포를 사용하는 래퍼를 생성합니다. 래퍼를 생성하십시오.

 $ gradle wrapper

BUILD SUCCESSFUL in 0s  
1 actionable task: 1 up-to-date  

그러면 gradlew라는 유닉스 스크립트와 gradlew.bat라는 Windows 명령이 jar 파일 및 속성 파일과 함께 생성됩니다. 결과 디렉토리 구조는 다음과 같습니다.

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

2 directories, 5 files  

프로젝트 properties 확인하기

tasks 태스크가 사용 가능한 태스크를 알려주면 properties 명령은 프로젝트 속성에 대해 동일한 태스크를 수행합니다. 이 명령을 사용해보십시오.

 $ ./gradlew properties
> Task :properties

------------------------------------------------------------
Root project  
------------------------------------------------------------

allprojects: [root project 'gradle-empty']  
ant: org.gradle.api.internal.project.DefaultAntBuilder@76a00494  
antBuilderFactory: org.gradle.api.internal.project.DefaultAntBuilderFactory@4c170b33  
artifacts: org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler_Decorated@508c41b5  
asDynamicObject: DynamicObject for root project 'gradle-empty'  
baseClassLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@3f48dd06  
buildDir: /Users/sigmadream/Works/gradle/gradle-empty/build  
buildFile: /Users/sigmadream/Works/gradle/gradle-empty/build.gradle  
buildScriptSource: org.gradle.groovy.scripts.NonExistentFileScriptSource@49bafadf  
buildscript: org.gradle.api.internal.initialization.DefaultScriptHandler@3d802e48  
childProjects: {}  
class: class org.gradle.api.internal.project.DefaultProject_Decorated  
classLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@fb341a4  
components: SoftwareComponentInternal set  
configurationActions: org.gradle.configuration.project.DefaultProjectConfigurationActionContainer@766a1db9  
configurationTargetIdentifier: org.gradle.configuration.ConfigurationTargetIdentifier$1@68986da9  
configurations: configuration container  
convention: org.gradle.api.internal.plugins.DefaultConvention@5456fc9c  
defaultTasks: []  
deferredProjectConfiguration: org.gradle.api.internal.project.DeferredProjectConfiguration@41fd29d3  
dependencies: org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler_Decorated@67dc7380  
depth: 0  
description: null  
displayName: root project 'gradle-empty'  
ext: org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension@4c82bff7  
extensions: org.gradle.api.internal.plugins.DefaultConvention@5456fc9c  
fileOperations: org.gradle.api.internal.file.DefaultFileOperations@2fd318e7  
fileResolver: org.gradle.api.internal.file.BaseDirFileResolver@7c80f7f  
gradle: build 'gradle-empty'  
group:  
identityPath: :  
inheritedScope: org.gradle.api.internal.ExtensibleDynamicObject$InheritedDynamicObject@38c3c75  
layout: org.gradle.api.internal.file.DefaultProjectLayout@5aa846f4  
logger: org.gradle.internal.logging.slf4j.OutputEventListenerBackedLogger@6d8b7966  
logging: org.gradle.internal.logging.services.DefaultLoggingManager@2a7f305f  
modelRegistry: org.gradle.model.internal.registry.DefaultModelRegistry@4872cef1  
modelSchemaStore: org.gradle.model.internal.manage.schema.extract.DefaultModelSchemaStore@50f5beed  
module: org.gradle.api.internal.artifacts.ProjectBackedModule@93e6402  
name: gradle-empty  
normalization: org.gradle.normalization.internal.DefaultInputNormalizationHandler_Decorated@6683bddc  
objects: org.gradle.api.internal.model.DefaultObjectFactory@35ad849b  
parent: null  
parentIdentifier: null  
path: :  
pluginManager: org.gradle.api.internal.plugins.DefaultPluginManager_Decorated@6b76d199  
plugins: [org.gradle.api.plugins.HelpTasksPlugin@6295dfe2]  
processOperations: org.gradle.api.internal.file.DefaultFileOperations@2fd318e7  
project: root project 'gradle-empty'  
projectConfigurator: org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator@168908cc  
projectDir: /Users/sigmadream/Works/gradle/gradle-empty  
projectEvaluationBroadcaster: ProjectEvaluationListener broadcast  
projectEvaluator: org.gradle.configuration.project.LifecycleProjectEvaluator@6d9f2a9c  
projectPath: :  
projectRegistry: org.gradle.api.internal.project.DefaultProjectRegistry@34cfe2e8  
properties: {...}  
providers: org.gradle.api.internal.provider.DefaultProviderFactory@69e807f1  
repositories: repository container  
resources: org.gradle.api.internal.resources.DefaultResourceHandler@37f9bd68  
rootDir: /Users/sigmadream/Works/gradle/gradle-empty  
rootProject: root project 'gradle-empty'  
scriptHandlerFactory: org.gradle.api.internal.initialization.DefaultScriptHandlerFactory@2326bac1  
scriptPluginFactory: org.gradle.configuration.ScriptPluginFactorySelector@68b5c4ef  
serviceRegistryFactory: org.gradle.internal.service.scopes.ProjectScopeServices$4@41cb9187  
services: ProjectScopeServices  
standardOutputCapture: org.gradle.internal.logging.services.DefaultLoggingManager@2a7f305f  
state: project state 'EXECUTED'  
status: release  
subprojects: []  
tasks: task set  
version: unspecified


BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

프로젝트의 이름은 기본적으로 폴더 이름과 일치(name: gradle-empty)합니다. 그룹 및 버전 속성을 지정할 수도 있지만 설명과 마찬가지로 기본값도 사용합니다.

buildFile 속성은 buildDir에있는 build.gradle의 정규화 된 경로 이름(buildFile: /Users/sigmadream/Works/gradle/gradle-empty/build.gradle)입니다. 기본적으로 build.gradle 파일이 들어있는 디렉토리인 projectDirbuild 하위 디렉토리(projectDir: /Users/sigmadream/Works/gradle/gradle-empty)입니다.

많은 속성을 변경 할 수 있습니다. build.gradle 파일에 다음 행을 추가하십시오.

description = 'Gradle Tutorial Basic'  
version = '1.0'  

이제 특성 태스크를 다시 실행하고 설명(description) 및 버전(version) 필드의 갱신 된 값을 보십시오.

$ ./gradlew properties
:properties
...
description: Gradle Tutorial Basic  
...
version: 1.0  
....

중요 task 설정

Gradle에는 자신의 프로젝트에서 구성 할 수있는 태스크 라이브러리가 함께 제공됩니다. 예를 들어, 한 위치에서 다른 위치로 파일을 복사하는 Copy라는 핵심 유형이 있습니다. 복사 태스크는 매우 강력합니다(자세한 내용은 문서 참조).하지만 여기서는 간단하게 진행하겠습니다.

다음 단계를 수행하십시오.

  1. src 디렉토리를 만듭니다.
  2. src 디렉토리에 myfile.txt라는 파일을 추가하십시오. 내용은 임의적입니다 (비어있을 수도 있습니다). 편의상 Hello, World!를 추가하였습니다.
  3. src 디렉토리를 dest라는 새 디렉토리에 복사하는 copy라는 작업을 정의하십시오. (dest 디렉토리를 만들 필요가 없습니다. 태스크가 대신 할 것입니다.)

구문은 다음과 같습니다.

task copy(type: Copy) {  
    from 'src'
    into 'dest'
}

이제 --all 플래그를 사용하여 tasks 명령을 실행하여 새 태스크를 볼 수 있습니다.

$ ./gradlew tasks --all

> Task :tasks

------------------------------------------------------------
All tasks runnable from root project - Gradle Tutorial Basic  
------------------------------------------------------------

Build Setup tasks  
-----------------
init - Initializes a new Gradle build.  
wrapper - Generates Gradle wrapper files.

Help tasks  
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle-empty'.  
components - Displays the components produced by root project 'gradle-empty'. [incubating]  
dependencies - Displays all dependencies declared in root project 'gradle-empty'.  
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-empty'.  
dependentComponents - Displays the dependent components of components in root project 'gradle-empty'. [incubating]  
help - Displays a help message.  
model - Displays the configuration model of root project 'gradle-empty'. [incubating]  
projects - Displays the sub-projects of root project 'gradle-empty'.  
properties - Displays the properties of root project 'gradle-empty'.  
tasks - Displays the tasks runnable from root project 'gradle-empty'.

Other tasks  
-----------
copy


BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

copy 태스크를 실행해 봅니다.

$ ./gradlew copy

BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

확인해 볼까요?

.
├── build.gradle
├── dest
│   └── myFile.txt
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
    └── myFile.txt

4 directories, 7 files  

dest 디렉토리에 myfile.txt라는 파일이 있는지, src 디렉토리의 내용과 일치하는지 확인하여 예상대로 작동하는지 확인하십시오.

Configure a core task and use a plugin

Gradle에는 다양한 플러그인이 포함되어 있으며 the Gradle plugin portal에서 더 많은 플러그인을 사용할 수 있습니다. 배포판에 포함 된 플러그인 중 하나가 기본 플러그인 입니다. Zip이라는 핵심 유형과 결합하여 구성된 이름과 위치로 프로젝트의 zip 아카이브를 만들 수 있습니다.

플러그인 구문을 사용하여 build.gradle 파일에 기본 플러그인을 추가하십시오. 플러그인 블록을 파일 상단에 추가하십시오.

plugins {  
    id 'base'
}

... rest of the build file ...

이제 src 디렉토리에서 zip 아카이브를 만드는 작업을 추가하십시오.

task zip(type: Zip) {  
    from 'src'
}

기본 플러그인은 설정과 함께 작동하여 build-distribution 폴더에 basic-demo-1.0.zip이라는 아카이브 파일을 만듭니다.

이 경우 단순히 새 zip 작업을 실행하고 생성 된 zip 파일이 예상 한 위치에 있는지 확인하십시오.

$ ./gradlew zip

BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

확인해 볼까요?

.
├── build
│   └── distributions
│       └── gradle-empty-1.0.zip
├── build.gradle
├── dest
│   └── myFile.txt
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
    └── myFile.txt

6 directories, 8 files  

태스크 명령을 다시 실행하여 기본 플러그인이 추가 한 태스크를보십시오.

$ ./gradlew tasks --all

> Task :tasks

------------------------------------------------------------
All tasks runnable from root project - Gradle Tutorial Basic  
------------------------------------------------------------

Build tasks  
-----------
assemble - Assembles the outputs of this project.  
build - Assembles and tests this project.  
clean - Deletes the build directory.

Build Setup tasks  
-----------------
init - Initializes a new Gradle build.  
wrapper - Generates Gradle wrapper files.

Help tasks  
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle-empty'.  
components - Displays the components produced by root project 'gradle-empty'. [incubating]  
dependencies - Displays all dependencies declared in root project 'gradle-empty'.  
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-empty'.  
dependentComponents - Displays the dependent components of components in root project 'gradle-empty'. [incubating]  
help - Displays a help message.  
model - Displays the configuration model of root project 'gradle-empty'. [incubating]  
projects - Displays the sub-projects of root project 'gradle-empty'.  
properties - Displays the properties of root project 'gradle-empty'.  
tasks - Displays the tasks runnable from root project 'gradle-empty'.

Verification tasks  
------------------
check - Runs all checks.

Other tasks  
-----------
copy  
zip

Rules  
-----
Pattern: clean<TaskName>: Cleans the output files of a task.  
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.  
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.


BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

어셈블 및 빌드 태스크는 컴파일 및 릴리스 파일 생성과 관련되어 있으므로 이 프로젝트에서 유용하지 않습니다. Java 플러그인과 같이 언어 플러그인은 상단에 생성됩니다.

빌드 디렉토리를 제거하는 매우 쉬운 방법을 제공합니다. clean 태스크를 실행하세요.

$ ./gradlew clean
clean:

BUILD SUCCESSFUL  

이제 빌드 폴더가 사라져야 합니다. clean 후에 폴더는 아래와 같습니다. 확인해 보셨나요?

.
├── build.gradle
├── dest
│   └── myFile.txt
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
    └── myFile.txt

4 directories, 7 files  

"Hello, World!" 태스크 추가

태스크를 Gradle 빌드(build.gradle)에 추가 하십시오. 구문은 다음과 같습니다.

task hello {  
    doLast {
        println 'Hello, World!'
    }
}

이 작업을 실행하면 "Hello, World!"라는 문자열이 콘솔에 출력됩니다.

$ ./gradlew hello

> Task :hello
Hello, World!


BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

hello 태스크의 내용은 taskdoLast와 같은 Gradle DSL의 명령을 사용합니다. 자신만의 태스크를 작성하는 것은 흥미로운 주제이지만이 가이드의 범위를 벗어납니다. 자세한 내용은 Writing Custom Gradle Tasks 참조하십시오.

Building Java Applications

이 안내서는 GradleBuild Init 플러그인을 사용하여 표준 양식으로 Java 프로젝트를 작성하는 방법을 보여줍니다.

Check the user manual

플러그인에는 프로젝트를 생성하는 init이라는 태스크가 하나 있습니다. init 태스크는 (기본 제공되는) 래퍼 태스크를 호출하여 Gradle 래퍼 스크립트 인 gradlew를 작성합니다.

init 태스크를 실행하려면 명령 프롬프트에서 다음을 실행하십시오.

$ mkdir java-demo
$ cd java-demo
$ gradle init --type java-application

BUILD SUCCESSFUL in 0s  
2 actionable tasks: 2 executed  

초기화 태스크는은 먼저 래퍼 작업을 실행하여 gradlewgradlew.bat 래퍼 스크립트를 생성합니다. 그런 다음 다음 구조로 새 프로젝트를 만듭니다.

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java
    │       └── App.java
    └── test
        └── java
            └── AppTest.java

7 directories, 8 files  

생성 된 프로젝트 파일

settings.gradle 파일은 크게 주석 처리되었지만 활성화 된 행은 하나뿐입니다.

rootProject.name='java-demo'  

기본 프로젝트인 java-demo에 루트 프로젝트의 이름이 지정됩니다.

생성된 build.gradle 파일에는 많은 주석이 있습니다.(의존성에 대한 버전 번호는 이후 버전의 Gradle에서 업데이트 될 수 있습니다).

apply plugin: 'java'  
apply plugin: 'application'

repositories {  
    jcenter()  
}

dependencies {  
    compile 'com.google.guava:guava:21.0'  
    testCompile 'junit:junit:4.12'         
}

mainClassName = 'App'  

빌드 파일은 java 및 응용 프로그램 플러그인을 추가합니다. 전자는 Java 프로젝트를 지원합니다. 후자를 사용하면 하나의 클래스를 main 메소드를 갖는 것으로 지정할 수 있습니다.이 메소드는 명령 행에서 빌드에 의해 실행될 수 있습니다. 데모에서 주 클래스의 이름은 App입니다.

src/main/java/App.java 파일은 다음과 같습니다.

public class App {  
    public String getGreeting() {
        return "Hello world.";
    }

    public static void main(String[] args) {  
        System.out.println(new App().getGreeting());
    }
}

src/test/java/AppTest.java 파일은 다음과 같습니다.

import org.junit.Test;  
import static org.junit.Assert.*;

public class AppTest {  
    @Test public void testAppHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull("app should have a greeting",
            classUnderTest.getGreeting());
    }
}

생성 된 테스트 클래스에는 JUnit@Test 주석으로 주석이 첨부 된 단일 테스트가 있습니다. 이 테스트는 App 클래스를 인스턴스화하고 getGreeting 메소드를 호출 한 다음 반환 된 값이 null이 아닌지 확인합니다.

빌드 실행

프로젝트를 빌드하려면 빌드 명령을 실행하십시오. 일반 gradle 명령을 사용할 수는 있지만 프로젝트에 래퍼 스크립트가 포함되어 있으면 대신 사용할 수있는 좋은 형식으로 간주됩니다.

$ ./gradlew build
Download https://jcenter.bintray.com/com/google/guava/guava/22.0/guava-22.0.pom  
Download https://jcenter.bintray.com/com/google/guava/guava-parent/22.0/guava-parent-22.0.pom  
Download https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.pom  
Download https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.0.18/error_prone_annotations-2.0.18.pom  
Download https://jcenter.bintray.com/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.pom  
Download https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.pom  
Download https://jcenter.bintray.com/com/google/errorprone/error_prone_parent/2.0.18/error_prone_parent-2.0.18.pom  
Download https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-parent/1.14/animal-sniffer-parent-1.14.pom  
Download https://jcenter.bintray.com/org/codehaus/mojo/mojo-parent/34/mojo-parent-34.pom  
Download https://jcenter.bintray.com/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar  
Download https://jcenter.bintray.com/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar  
Download https://jcenter.bintray.com/com/google/errorprone/error_prone_annotations/2.0.18/error_prone_annotations-2.0.18.jar  
Download https://jcenter.bintray.com/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar  
Download https://jcenter.bintray.com/com/google/guava/guava/22.0/guava-22.0.jar

BUILD SUCCESSFUL in 11s  
7 actionable tasks: 7 executed  

처음으로 빌드를 실행할 때 Gradle~/.gradle 디렉토리 아래에 캐시에 이미 GuavaJUnit 라이브러리가 있는지 확인합니다. 그렇지 않으면 라이브러리가 다운로드되어 저장됩니다. 다음 번에 빌드를 실행하면 캐시 된 버전이 사용됩니다. 빌드 태스크는 클래스를 컴파일하고 테스트를 실행하며 테스트 보고서를 생성합니다.

build/reports/tests/test/index.html에있는 HTML 출력 파일을 열어 테스트 보고서를 볼 수 있습니다.

응용 프로그램 실행

Gradle 빌드에서 Application 플러그인을 사용했기 때문에 명령 행에서 응용 프로그램을 실행할 수 있습니다. 먼저, 작업 태스크를 사용하여 플러그인이 추가 한 태스크를 확인하십시오.

$ ./gradlew tasks

> Task :tasks

------------------------------------------------------------
All tasks runnable from root project  
------------------------------------------------------------

Application tasks  
-----------------
run - Runs this project as a JVM application

Build tasks  
-----------
assemble - Assembles the outputs of this project.  
build - Assembles and tests this project.  
buildDependents - Assembles and tests this project and all projects that depend on it.  
buildNeeded - Assembles and tests this project and all projects it depends on.  
classes - Assembles main classes.  
clean - Deletes the build directory.  
jar - Assembles a jar archive containing the main classes.  
testClasses - Assembles test classes.

Build Setup tasks  
-----------------
init - Initializes a new Gradle build.  
wrapper - Generates Gradle wrapper files.

Distribution tasks  
------------------
assembleDist - Assembles the main distributions  
distTar - Bundles the project as a distribution.  
distZip - Bundles the project as a distribution.  
installDist - Installs the project as a distribution as-is.

Documentation tasks  
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks  
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'java-demo'.  
components - Displays the components produced by root project 'java-demo'. [incubating]  
dependencies - Displays all dependencies declared in root project 'java-demo'.  
dependencyInsight - Displays the insight into a specific dependency in root project 'java-demo'.  
dependentComponents - Displays the dependent components of components in root project 'java-demo'. [incubating]  
help - Displays a help message.  
model - Displays the configuration model of root project 'java-demo'. [incubating]  
projects - Displays the sub-projects of root project 'java-demo'.  
properties - Displays the properties of root project 'java-demo'.  
tasks - Displays the tasks runnable from root project 'java-demo'.

Verification tasks  
------------------
check - Runs all checks.  
test - Runs the unit tests.

Rules  
-----
Pattern: clean<TaskName>: Cleans the output files of a task.  
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.  
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradlew tasks --all

To see more detail about a task, run gradlew help --task <task>


BUILD SUCCESSFUL in 0s  
1 actionable task: 1 executed  

실행 태스크는 Gradle에게 mainClassName 특성에 할당 된 클래스에서 main 메소드를 실행하도록 지시합니다.

$ ./gradlew run

> Task :run
Hello world.


BUILD SUCCESSFUL in 0s  
2 actionable tasks: 1 executed, 1 up-to-date  

Creating Multi-project Builds

루트 프로젝트 만들기

첫 번째 단계는 새 프로젝트의 폴더를 만들고 프로젝트에 Gradle Wrapper를 추가하는 것입니다. Build Init 플러그인을 사용하면 필요한 settings.gradlebuild.gradle도 추가됩니다.

$ mkdir creating-multi-project-builds
$ cd creating-multi-project-builds
$ gradle init

BUILD SUCCESSFUL in 0s  
2 actionable tasks: 2 executed  

init을 사용하면 사용자 정의 할 수있는 뼈대 build.gradlesettings.gradle 파일을 만들 수 있습니다.

이렇게하면 Gradle 버전을 프로젝트에 잠글 수 있으며 이후에는 gradle 대신 ./gradlew (또는 Windows의 경우 gradlew.bat)를 사용할 수 있습니다.

Configure from above

다중 프로젝트에서 최상위 빌드 파일 (루트 프로젝트라고도 함)을 사용하여 최대한 많은 공통성을 구성 할 수 있으며 하위 프로젝트는 해당 하위 프로젝트에 필요한 것만 사용자 정의 할 수 있습니다.

매개 변수없이 init 태스크를 사용할 때 Gradle은 주석 블록에 기본 Java 레이아웃이있는 build.gradle 파일을 생성합니다. build.gradle을 열고 내용을 다음으로 바꿉니다.

allprojects {  
    repositories {
        jcenter() 
    }
}

allprojects 블록은 모든 서브 프로젝트와 루트 프로젝트에 적용될 구성 항목을 추가하는 데 사용됩니다. 비슷한 방식으로 subprojects 블록을 사용하여 모든 하위 프로젝트에 대한 구성 항목만 추가 할 수 있습니다. 루트 프로젝트에서 원하는만큼이 두 블록을 사용할 수 있습니다.

이제 최상위 빌드 파일의 subprojects 블록을 통해 추가 할 각 모듈의 버전을 다음과 같이 설정하십시오.

subprojects {  
    version = '1.0'
}

Groovy 라이브러리 하위 프로젝트 추가

폴더를 만들고, build.gradle도 생성합니다. 그리고 Groovy 라이브러리 프로젝트 컨텐츠를 추가하십시오.

$ mkdir greeting-library
$ touch build.gradle

greeting-library/build.gradle에 다음을 추가 합니다.

apply plugin : 'groovy'

dependencies {  
    compile 'org.codehaus.groovy:groovy:2.4.10'

    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4', {
        exclude module : 'groovy-all'
    }
}

이제 최상위 프로젝트의 settings.gradle을 편집하여 새 Groovy 라이브러리 프로젝트를 다중 프로젝트 빌드의 일부로 만듭니다.

include 'greeting-library'  

마지막으로 greeting-library 아래에 src/main/groovy 폴더를 만들고 패키지 폴더 인 greeter를 추가하십시오.

$ mkdir -p src/main/groovy/greeter
$ mkdir -p src/test/groovy/greeter

greetingFormatter 클래스를 src/main/groovyGreeter 패키지에 추가합니다

# GreetingFormatter.groovy

package greeter

import groovy.transform.CompileStatic

@CompileStatic
class GreetingFormatter {  
    static String greeting(final String name) {
        "Hello, ${name.capitalize()}"
    }
}

테스트도 greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy에 추가합니다.

package greeter

import spock.lang.Specification

class GreetingFormatterSpec extends Specification {

    def 'Creating a greeting'() {

        expect: 'The greeeting to be correctly capitalized'
        GreetingFormatter.greeting('gradlephant') == 'Hello, Gradlephant'

    }
}

최상위 프로젝트 디렉토리에서 ./gradlew build를 실행하십시오.

$ ./gradlew build
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-ant/2.4.10/groovy-ant-2.4.10.pom  
Download https://jcenter.bintray.com/org/apache/ant/ant-launcher/1.9.4/ant-launcher-1.9.4.pom  
Download https://jcenter.bintray.com/org/apache/ant/ant-antlr/1.9.4/ant-antlr-1.9.4.pom  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-groovydoc/2.4.10/groovy-groovydoc-2.4.10.pom  
Download https://jcenter.bintray.com/org/apache/ant/ant/1.9.4/ant-1.9.4.pom  
Download https://jcenter.bintray.com/org/apache/ant/ant-junit/1.9.4/ant-junit-1.9.4.pom  
Download https://jcenter.bintray.com/org/apache/ant/ant-parent/1.9.4/ant-parent-1.9.4.pom  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-templates/2.4.10/groovy-templates-2.4.10.pom  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-xml/2.4.10/groovy-xml-2.4.10.pom  
Download https://jcenter.bintray.com/org/apache/ant/ant-antlr/1.9.4/ant-antlr-1.9.4.jar  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-templates/2.4.10/groovy-templates-2.4.10.jar  
Download https://jcenter.bintray.com/org/apache/ant/ant-launcher/1.9.4/ant-launcher-1.9.4.jar  
Download https://jcenter.bintray.com/org/apache/ant/ant/1.9.4/ant-1.9.4.jar  
Download https://jcenter.bintray.com/org/apache/ant/ant-junit/1.9.4/ant-junit-1.9.4.jar  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-ant/2.4.10/groovy-ant-2.4.10.jar  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-groovydoc/2.4.10/groovy-groovydoc-2.4.10.jar  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-xml/2.4.10/groovy-xml-2.4.10.jar  
Download https://jcenter.bintray.com/org/spockframework/spock-core/1.0-groovy-2.4/spock-core-1.0-groovy-2.4.pom  
Download https://jcenter.bintray.com/org/spockframework/spock-core/1.0-groovy-2.4/spock-core-1.0-groovy-2.4.jar

BUILD SUCCESSFUL in 17s  
4 actionable tasks: 4 executed  

Gradle은 greeting-library에 빌드 작업이 있음을 자동으로 감지하여 실행했습니다. 이것은 Gradle 다중 프로젝트 빌드의 강력한 기능 중 하나입니다. 하위 프로젝트의 작업이 최상위 프로젝트의 작업과 동일한 이름인 경우 빌드 유지 관리가 쉬울 것이고 Gradle은 최상위 수준에서 공통 작업 이름을 지정하여 각 프로젝트에서 동일한 작업을 실행할 수 있습니다.

그러나 단일 하위 프로젝트는 진정으로 다중 프로젝트 빌드를 작성하지 않습니다. 그러므로 다음 단계는이 라이브러리를 소비 할 서브 프로젝트를 추가하는 것입니다.

Java 응용 프로그램 하위 프로젝트 추가

응용 프로그램을 포함 할 하위 프로젝트의 루트 프로젝트에 폴더를 만듭니다.

$ mkdir greeter
$ cd greeter
$ touch build.gradle

Java 프로젝트이므로 Java 플러그인이 필요합니다. 이 플러그인을 Java 응용 프로그램으로 만들려면 Application 플러그인을 추가하십시오.

응용 프로그램 플러그인을 사용하면 모든 응용 프로그램 JAR 및 모든 전이 의존성을 단일 ZIP 또는 TAR 파일로 묶을 수 있습니다. 또한 사용자가 응용 프로그램을 쉽게 실행할 수 있도록 두 개의 시작 스크립트 (UNIX 운영 체제 용과 Windows 용)를 아카이브에 추가합니다.

다시 한번 settings.gradle을 업데이트하여 새 프로젝트를 추가하십시오.

Java 애플리케이션을 위한 폴더를 만듭니다.

$ mkdir -p greeter/src/main/java/greeter

Greeter.java를 구성합니다.

package greeter;

public class Greeter {  
    public static void main(String[] args) {
        final String output = GreetingFormatter.greeting(args[0]);
        System.out.println(output);
    }
}

greeter/build.gradle에 아래 내용을 추가 합니다.

mainClassName = 'greeter.Greeter'  

빌드를 실행하십시오 (아직 모든 종속성을 해결하지 않았기 때문에 실패합니다).

$ ./gradlew build

> Task :greeter:compileJava
/Users/sigmadream/Works/gradle/creating-multi-project-builds/greeter/src/main/java/greeter/Greeter.java:5: error: cannot find symbol
        final String output = GreetingFormatter.greeting(args[0]);
                              ^
  symbol:   variable GreetingFormatter
  location: class Greeter
1 error


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':greeter:compileJava'.  
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 0s  
1 actionable task: 1 executed  

Greeter 프로젝트는 Greeter 라이브러리를 어디에서 찾을 수 있는지 모르기 때문입니다. 하위 프로젝트의 콜렉션을 작성한다고해서 자동으로 다른 하위 프로젝트에 자동으로 해당 아티팩트가 사용 가능하게되는 것은 아닙니다. 이는 매우 취약한 프로젝트로 이어질 수 있습니다. Gradle에는 특정 하위 프로젝트의 아티팩트를 다른 하위 프로젝트의 종속성과 연결하는 특정 구문이 있습니다. greeter 하위 프로젝트에서 build.gradle 스크립트를 다시 편집하고 다음을 추가하십시오.

dependencies {  
    compile project(':greeting-library') 
}

다시 빌드를 실행하면 성공합니다.

$ ./gradlew build

BUILD SUCCESSFUL in 0s  
9 actionable tasks: 1 executed, 8 up-to-date  

응용 프로그램 자체의 코드가 작동하는지 테스트를 추가하십시오. Spock FrameworkJava 코드 테스트에도 널리 사용되는 방법이기 때문에 Greeter 하위 프로젝트의 build.gradle 스크립트에 Groovy 플러그인을 먼저 추가하여 테스트를 작성하십시오.

Groovy Plugin이 필요합니다. 여기에는 Java 플러그인이 포함되어 있으므로 그림과 같이 java라는 단어를 groovy로 바꿀 수 있습니다.

groovy 플러그인을 사용하면 자동으로 Java 플러그인이 적용되므로 실제로 'java' 라인을 삭제할 수 있습니다. 그러나 의미론을 위해 둘 다 유지하는 것이 더 좋을 수 있습니다. 이는 주로 Java 프로젝트를 작성 중임을 나타냅니다.

그런 다음 greeter 패키지의 GreeterSpec이라는 테스트를 src/test/groovy/greeter 디렉토리의 하위 프로젝트에 추가합니다 (아직 존재하지 않으면 해당 디렉토리를 만들어야합니다).

$ mkdir -p greeter/src/test/groovy/greeter

greeter/src/test/groovy/greeter/GreeterSpec.groovy에 아래를 추가 합니다.

package greeter

import spock.lang.Specification

class GreeterSpec extends Specification {

    def 'Calling the entry point'() {

        setup: 'Re-route standard out'
        def buf = new ByteArrayOutputStream(1024)
        System.out = new PrintStream(buf)

        when: 'The entrypoint is executed'
        Greeter.main('gradlephant')

        then: 'The correct greeting is output'
        buf.toString() == "Hello, Gradlephant\n"
    }
}

전체 빌드를 다시 실행하는 대신 greeter 하위 프로젝트 내에서 테스트를 실행하십시오. Gradle 래퍼 스크립트는 최상위에만 존재하므로 먼저 디렉토리를 변경하십시오.

$ ./gradlew :greeter:test


BUILD SUCCESSFUL in 2s  
5 actionable tasks: 2 executed, 3 up-to-date  

작업 이름으로 :SUBPROJECT:TASK 형식을 사용하여 상단 (또는 다른 하위 프로젝트)의 하위 프로젝트에서 모든 작업을 실행할 수 있습니다. 이렇게하면 다음과 같은 대안을 사용할 필요가 없어집니다 (역시 작동 함).

$ ../gradlew test

BUILD SUCCESSFUL in 0s  
5 actionable tasks: 5 up-to-date  

문서 추가

소프트웨어 프로젝트 용 문서를 만드는 것이 좋습니다. 이 목표를 달성하기위한 여러 가지 저작 방법이 있지만 매우 인기있는 Asciidoctor 도구가 사용됩니다.

먼저 루트 프로젝트의 build.gradle 스크립트 상단에 플러그인 블록에 Asciidoctor 플러그인을 추가하십시오.

plugins {  
  id 'org.asciidoctor.convert' version '1.5.3' apply false 
}

apply false를 사용하면 플러그인이 전체 프로젝트에 추가되지만 루트 프로젝트에 추가되지는 않습니다.

문서화를 담당할 폴더를 생성합니다.

$ mkdir docs

docs 폴더에 다음 내용으로 build.gradle 파일을 만듭니다.

apply plugin : 'org.asciidoctor.convert' 

asciidoctor {  
    sources {
        include 'greeter.adoc' 
    }
}

build.dependsOn 'asciidoctor' 

이 하위 프로젝트에 Asciidoctor 플러그인을 적용하십시오. 이 기술을 사용하면 하위 프로젝트에 선택적으로 플러그인을 적용하면서 루트 프로젝트의 모든 플러그인을 정의 할 수 있습니다.

플러그인이 기본 소스 폴더 src/docs/asciidoc에서 greeter.adoc라는 문서를 찾도록합니다.

asciidoctor 작업을 빌드 수명주기에 추가하여 최상위 프로젝트에 대해 빌드가 실행되면 문서도 빌드되도록합니다.

루트의 settings.gradle에 아래를 추가 합니다.

include 'docs'  

docs/src/docs/asciidoc/greeter.adoc에 아래 내용을 추가 합니다.

= Greeter Command-line Application

A simple application demonstrating the flexibility of a Gradle multi-project.

== Installation

Unpack the ZIP or TAR file in a suitable location

== Usage

[listing]
----
$ cd greeter-1.0
$ ./bin/greeter gradlephant

Hello, Gradlephant  
----

이제 빌드해 봅시다.

$ ./gradlew asciidoctor
Download https://jcenter.bintray.com/org/sonatype/oss/oss-parent/3/oss-parent-3.pom  
Download https://jcenter.bintray.com/org/jruby/jruby-complete/1.7.21/jruby-complete-1.7.21.pom  
Download https://jcenter.bintray.com/org/jruby/jruby-parent/1.7.21/jruby-parent-1.7.21.pom  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-all/1.8.9/groovy-all-1.8.9.pom  
Download https://jcenter.bintray.com/org/codehaus/groovy/groovy-all/1.8.9/groovy-all-1.8.9.jar

BUILD SUCCESSFUL in 20s  
1 actionable task: 1 executed  

배포 자료실에 설명서 포함

문서는 게시 할 때 유용하지만 응용 프로그램과 함께 배포되는 사용 설명서는 응용 프로그램을 사용해 보는 사람들에게 매우 유용합니다. greeter 하위 프로젝트의 build.gradle 스크립트에서 작업 종속성을 업데이트하여 생성 된 문서를 배포본에 추가하십시오.

greeter/build.gradle에 다음을 추가하세요.

distZip {  
    from project(':docs').asciidoctor, { 
        into "${project.name}-${version}"
    }
}
distTar {  
    from project(':docs').asciidoctor, {
        into "${project.name}-${version}"
    }
}

빌드를 실행하세요.

$ ./gradlew build

BUILD SUCCESSFUL in 0s  
12 actionable tasks: 2 executed, 10 up-to-date  

공통 빌드 스크립트 코드 리팩터링

build.gradle에 아래 내용을 추가 합니다.

configure(subprojects.findAll {it.name == 'greeter' || it.name == 'greeting-library'} ) { 

    apply plugin : 'groovy'

    dependencies {
        testCompile 'org.spockframework:spock-core:1.0-groovy-2.4', {
            exclude module : 'groovy-all'
        }
    }
}

greeting-library/build.gradle의 코드 중 다음 내용을 삭제합니다.

apply plugin : 'groovy'

dependencies {  
    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4', {
        exclude module : 'groovy-all'
    }
}

greeter/build.gradle에서 비슷한 곳을 제거하십시오.

최상위 레벨부터 모든 것을 다시 실행하여 모든 것이 여전히 작동하는지 확인하십시오.

$ ./gradlew clean build