본문

[2018.09.27] 29. Gradle 실습1 - Multi Build

참조

도입

이번 포스팅에서는 Gradle의 Multi-build에 대해 실습할 예정이다.

프로젝트에서 많은 설정 부분이 자동화되어 있다. 

그것을 설정하는 시스템 중 하나가 Gradle 시스템이기 때문에 Gradle을 공부하며 정리할 예정이다.

지난 Gradle 개념


삽질 포인트

결론적으로, Multi-build(Java, Kotlin)를 완료 후 빌드 결과로 class 파일을 실행해 결과를 확인할 예정이었다.

구분

Gradle build 여부

java 명령어로 실행 가능 여부

Java file

O

O

Kotlin file

O

X

Java, Kotlin file 모두 Gradle를 통해 build가 완료되었다.

하지만, java 명령어를 통해 kotlin class file은 실행되지 않았다. 아래처럼 오류 발생

1
2
3
4
5
6
7
8
9
/build/classes/kotlin/main > java HelloKotlinKt
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
    at HelloKotlinKt.main(HelloKotlin.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more
cs

원인: Kotlin은 Java와 호환이되기 때문에 당연히 build가 완료된 class 파일은 java 명령어를 통해 실행이 가능하다고 생각했다.

해결책: Kotlin 명령어로 실행하면 해결


그러나, 여기서 의문점은 kotlin의 build 결과, java의 build 결과가 모두 class 파일이니 java 명령어로도, kotlin 명령어로도 모두 실행 가능해야하는 것 아닐까?

TODO: 이것은 추후 확인해봐야겠다.


실습

Step1. gradle 프로젝트 생성 (명령어: gradle init)

1
2
3
4
5
6
7
8
9
└── gradle
    ├── build
    ├── build.gradle        // 해당 프로젝트의 의존성, 플러그인, 스크립트 등 설정
    ├── gradle              // 설정 파일 wrapper로 감싸 있어 OS에 의존성 X
    ├── gradlew             // 리눅스 계열에서 실행 가능한 파일
    ├── gradlew.bat         // 윈도우에서 실행 가능한 bat 파일
    ├── java                // 하위 프로젝트 1
    ├── kotlin              // 하위 프로젝트 2
    └── settings.gradle     // 프로젝트 간 관계 설정
cs


Step2. 최상위 프로젝트의 build.gradle 및 setting.gradle 설정

build.gradle

setting.gradle

1
2
3
4
5
6
7
8
9
10
11
12
// 최상위 프로젝트 포함(O) 설정: allprojects
// 최상위 프로젝트 포함(X) 오직 하위 설정: subprojects
subprojects {
  group = "HelloGradle"
 
  repositories {
    mavenCentral()
  }
 
  dependencies {
  }
}
cs
1
2
3
4
5
rootProject.name = 'Hello gradle'
 
// 하위 프로젝트 
include 'java'
include 'kotlin'
cs


Step3. 하위 프로젝트의 build.gradle 설정

a. Java

build.gradle

1
2
3
4
5
6
7
8
// Java 플러그인 설정
apply plugin: 'java'
 
sourceCompatibility = 1.8
 
dependencies {
  testCompile 'junit:junit:4.12'
}
cs

b. Kotlin

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Kotlin 플러그인 
apply plugin: 'kotlin'
 
buildscript {
    ext.kotlin_version = '1.2.31'  
 
    repositories {
        mavenCentral()
    }
 
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
    }
}
 
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
 
    testCompile "org.jetbrains.kotlin:kotlin-test"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit"
}
 
cs


Step4. 코드 작성

a. Java

1
2
3
4
5
6
7
import java.util.Scanner;
 
class HelloJava {
    public static void main(String[] args) {
      System.out.println("Hello, Java!");
    }
}

cs

b. Kotlin

1
2
3
fun main(args: Array<String>) {
  println("Hello, Kotlin!")
}
cs


Step5. 결과 확인

a. Java

1
2
java/build/classes/java/main > java HelloJava
Hello, Java!

cs

b. Kotlin

1
2
kotlin/build/classes/kotlin/main > kotlin HelloKotlinKt
Hello, Kotlin!
cs



#gradle #multi build #multi project #멀티 빌드


공유

댓글