Tag Archives: Gradle

Gradle 실행가능한 jar 파일 생성하기

gradle

Gradle을 처음 봤을때의 인상은 외국애들이 또 이런 복잡한것을 만들어냈구나..ㅠ 였습니다. 사실 지금도 그렇게 생각하지만 알면알수록 Gradle의 매력이 있습니다. 정말 수많은 다양한 일들을 할 수 있는것 같습니다. 기존의 Maven이 했었던 일들을 그대로 흡수하고 Gradle만이 할 수 있는 일들도 끝을 알수 없을정도로 많은 기능이 제공되네요.

이번에는 Gradle을 이용한 실행가능한 jar 파일을 생성하는 방법을 기록차 정리해 봅니다. build.gradle 파일에 다음과 같은 내용을 추가해 주면 됩니다.

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

mainClassName = 'kr.pe.theeye.MyApp'
sourceCompatibility = 1.7
version = '1.0'

jar {
    manifest {
        attributes  'Title': 'My Application', 'Version': version, 'Main-Class': mainClassName
    }
    archiveName 'MyApp.jar'
    dependsOn configurations.runtime
    from {
        configurations.compile.collect {it.isDirectory()? it: zipTree(it)}
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.10'
}

repositories와 dependencies의 내용은 여기서 중요하지 않으니 생략하도록 하겠습니다. 먼저 정의해 두어야 하는 설정은 mainClassName과 version입니다. 당연히 배포하려는 어플리케이션의 클래스와 버전입니다. 여기서 mainClassName은 어플리케이션의 진입 지점이 되는 즉 main 메소드가 위치하는 클래스를 지정해주면 됩니다.

그다음은 jar { … } 설정을 보셔야 합니다. 이러한 설정없이 jar로 빌드해보면 Manifest 파일을 찾을 수 없다며 실행이 되지 않는데요, 이 내용을 생성해 줍니다. 간단하게 어플리케이션의 메타데이터라고 생각하시면 됩니다. 어플리케이션의 이름과 미리 지정해둔 버전과 메인클래스를 지정해주면 됩니다.

archiveName은 실제로 빌드시에 생성될 파일이름을 정해주시면 됩니다. 이후에 설정은 의존성 있는 파일들을 몽땅 jar에 포함시키는 설정입니다. 이러한 설정을 해주신 다음에 gradle jar를 실행해주면 디폴트로 build/libs 디렉토리 안에 바이너리가 생성됩니다.

IntelliJ를 이용하신다면 다음과 같이 Gradle 탭의 메뉴를 사용하시면 됩니다.

gradle_jar_button

Gradle 기반 Spring Boot 프로젝트 구축하기

Spring Boot는 기존의 복잡한 Spring 프레임워크를 활용한 개발을 매우 간단하게 활용할 수 있도록 만들어진 프레임워크입니다. Groovy기반의 Rails의 느낌이 날 정도의 개발 환경을 구축할 수 있지만 여기서는 Java 기반의 프로젝트 개발을 설명합니다. IntelliJ에서 진행되었으며 Eclipse도 크게 다르지 않을것이라 생각합니다.

687474703a2f2f626c6f672e737072696e67736f757263652e6f72672f77702d636f6e74656e742f75706c6f6164732f323031332f30382f737072696e672e706e67

잠깐밖에 다루어보지 않았지만 Spring Boot의 가장 큰 장점은 설정 파일이 사실상 전무하게 프로젝트를 당장 구동할 수 있다는 점인것 같습니다. 모든것을 어노테이션만으로 구성할 수 있습니다. 이미 Spring이 많은부분 이렇게 진화해왔지만 아예 시작부터 운영까지 단순화하는것이 목적으로 보여집니다. Spring의 경량화 버전이라기 보다는 그림과 같은 손쉽게 사용할 수 있는 인터페이스를 제공하고 있다고 보는것이 옳은것 같습니다.

2

IntelliJ를 실행한 뒤 Quick Start에서 Create New Project를 선택합니다. 위와 같은 화면이 뜨는데 Gradle를 선택해 줍니다.

3-2

이후에 Gradle 설정 화면이 나옵니다. 여기서 위와 같이 2개를 체크합니다. 위와 같은 옵션은 기본적으로 Gradle을 위한 프로젝트의 기본 형태를 자동으로 생성해 줍니다.

4

프로젝트가 생성되면 위와 같은 형태의 프로젝트 구조를 확인할 수 있습니다. 기존의 Eclipse 환경에 익숙한 저에게는 매우 특이한 디렉토리 구조라고 느껴집니다. 위는 Maven 프로젝트의 기본 구조이며 다음과 같은 의미를 가지고 있습니다.

디렉토리 설명
src/main/java 어플리케이션, 라이브러리 소스
src/main/resources 어플리케이션, 라이브러리 리소스
src/main/filters 리소스 필터 파일
src/main/assembly 어셈블리 디스크립터
src/main/config 설정 파일
src/main/scripts 어플리케이션, 라이브러리 스크립트
src/main/webapp 웹 어플리케이션 소스
src/test/java 테스트 소스
src/test/resources 테스트 리소스
src/test/filters 테스트 리소스 필터 파일
src/site 사이트
LICENSE.txt 프로젝트의 라이센스
NOTICE.txt 프로젝트 라이브러리에서 필요로 하는 주의사항 특징
README.txt 프로젝트의 리드미
buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-snapshot" }
        mavenLocal()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC1")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'

sourceCompatibility = 1.7
version = '1.0'

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-snapshot" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.0.0.RC1")
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

build.gradle 파일을 위와같이 수정해 줍니다. build.gradle 파일이 한번 수정되면 IntelliJ가 자동으로 필요한 라이브러리를 다운받고 의존성 문제를 해결해 줍니다. 하지만 곧바로 적용하고 싶으실 경우 다음과 같은 방법을 사용하시면 됩니다.

5

보시면 Gradle 탭이 존재합니다. 눌러 보시면 실행가능한 Task 리스트가 나옵니다. 탭의 왼쪽 상단을 보시면 강제 리프레시 버튼이 존재하는데 저걸 눌러주면 의존성 문제를 강제로 해결해 줍니다.

6

이제 부터 위와 같이 hello 패키지를 만들고 그안에 두개의 클래스를 추가할 것입니다. 먼서 HelloController부터 만들어보겠습니다.

package hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

스프링 개발을 기존에 해오신 분들이라면 위의 의미를 바로 아실것입니다. 한가지만 짚고 넘어가자면 @RestController는 @Controller와 @ResponseBody를 합친 기능을 합니다. 그러므로 곧바로 렌더링할 스트링을 바로 반환하는것을 볼 수 있습니다. 이번에는 Application을 만들어 보겠습니다.

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        System.out.println("Spring Boot Started.");
    }

}

이제 끝났습니다. 예상이 되시겠지만 위에서 보여지는것들을 몇가지 정리해보자면 다음과 같습니다.

  • @Configuration 태그는 현재의 클래스가 Spring의 설정파일임을 어플리케이션 컨텍스트에게 알려주는 역할을 합니다.
  • @EnableAutoConfiguration 은 Spring Boot가 클래스패스 세팅, 다른 Bean들, 다양한 설정들에 의해 Bean을 추가하도록 합니다.
  • 일반적으로 기존의 Spring MVC 어플리케이션에서는 @EnableWebMvc 태그를 사용했지만 Spring Boot는 클래스패스에서 spring-webmvc를 발견할 경우 자동으로 추가합니다. 이러한 플래그는 DispatcherServlet을 세팅하는것과 같은 개발중인 어플리케이션을 웹어플리케이션으로 활성화 하는 핵심 키가 됩니다.
  • @ComponentScan 은 Spring에게 hello 패키지 안에서 다른 컴포넌트, 설정, 서비스를 찾도록 합니다. 이 설정을 통해 HelloController를 찾는것이 가능해집니다.

여기서 main() 메소드는 Spring Boot의 SpringApplication.run() 메소드를 실행함으로써 어플리케이션을 시작하게 됩니다. 여기까지 단 한줄의 XML 코드도 볼수 없었습니다. 심지어 web.xml도 보이지 않습니다. 이 어플리케이션은 100% 순수한 Java 어플리케이션이고 이 프로젝트를 구동하기 위한 어떤 인프라(WAS 설정등)의 구성 작업도 하지 않았습니다.

7

이제 어플리케이션을 구동해보겠습니다. Application 클래스에서 마우스 오른쪽 버튼이나 Ctrl + Shift + R을 눌러 실행합니다.

8

위와 같이 어렵지 않게 서비스가 구동됩니다. 8080포트로 구동이 되었네요. http://localhost:8080/으로 접속해서 확인해 보면 HelloController.index()가 실행된것을 확인할 수 있습니다. 지금까지 제작한 예제를 첨부해두겠습니다. [HelloSpringBoot]

참고 : https://spring.io/guides/gs/spring-boot/