Java 빌드 도구

소스코드를 컴파일, 테스트, 정적 분석, 실행가능한 어플리케이션으로 자동 생성하는 프로그램.

  • 계속해서 늘어나는 라이브러리를 자동으로 추가하고, 관리하는 역할
  • 라이브러리 버전을 자동으로 동기화하는 역할

라이브러리를 직접 다운받아와서 작업하는 것이 번거로움이 많기 떄문에, 이런 것을 자동화해주는 툴이다.

또한, 빌드 도구없이 IDE를 통해 빌드하고 운영환경에 배포하면,

  • 운영환경에 배포되는 버전이 개발자 PC에 의해 결정됨
  • 빌드와 배포를 자동화하는 것이 불가능해짐

따라서, 이러한 수동배포를 특정 환경에서 자동배포로서 바꾸는 부분에 있어서도, 정형화된 빌드 도구를 이용하는 장점이 될 수 있다.

또한, 빌드의 과정이 단순히 컴파일 뿐만 아니라 여러가지 많은 작업들이 수반되기 때문에 (javadoc 생성, 빌드번호 획득, 테스트 실시 및 처리, 릴리즈 등등…) 이런 것들을 일관적으로 진행하기 위해서 빌드 도구를 사용한다.

자바 빌드 도구 종류

Ant

초기 자바 빌드도구로 많이 사용하였다.

  • 자바 기반 빌드툴로, 플랫폼에 독립적으로 실행
  • XML 기반 설정 파일 사용 (build.xml)
  • 미리 정의된 테스크를 사용하여 배치 작업 빠르게 설정 가능.

어플리케이션 빌드, 테스트, 배치를 기술하기 위해서 빌드 파일을 사용한다. XML 형식으로 되어있는 빌드 파일에 선언적으로 작성, 전체 과정을 기술하는 것이 아니라 단계를 선언하는 방식으로 되어있어 재사용, 유지보수가 편하다.

실행

ant [option] [target [target2 [target3] … ]]

  • 실행하면 build.xml 파일을 현재 디렉토리부터 시작해 상위까지 이동해가면서 검색 후 실행한다.
  • build.xml 파일이 발견되면 build.xml 파일에 정의되어 있는 테스크에 따라 알맞은 배치 작업을 수행한다.

단점

  • 단순히 빌드도구로만 작동하고, remote repository를 가져올 수 없었음.
  • 스크립트의 재사용이 어렵다.


Maven

Ant의 대안으로 만들어진 빌드 툴.

프로젝트에 의존되는 라이브러리들이 pom.xml에서 의존 관계를 정의한다. pom.xml에서 프로젝트의 구성, 프로젝트에서 사용하는 외부 플러그인과 그 의존관계를 정의할 수 있다.

자세한 pom 구조는 여기서 확인 가능 하다. Maven 저장소와 의존성 관리

여기서 정의한 플러그인은 Maven Repository (java 패키지 저장소, pypi 같은거)를 통해 Remote로 자동으로 다운로드하여, 로컬에서 관리할 수 있다.

  • xml, remote repository를 가져올 수 있다.
  • jar, classPath를 선언만 하면 직접 다운로드할 필요 없이 Repository에서 가져와준다.
  • 자동 라이브러리 관리 기능이 추가됨.

단점

  • 라이브러리가 서로 종속할 경우 XML이 복잡해진다.
  • 계층적인 데이터를 표현하기 좋자만, 플로우나 조건부 상황을 표현하기 어렵다.
  • 편리하지만 맞춤화된 로직 실행이 어렵다.


Gradle

Ant와 Maven을 보완한 빌드 도구.

  • 일단 Maven에 비해 성능이 무지 좋다.
  • Groovy, remote repository 가져올 수 있음. Groovy: JVM에서 실행되는 스크립트 언어, Java와 호환이 된다.
  • 동적 빌드는 Groovy 스크립트로 플러그인을 호출하여 짤 수 있다.
  • Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 커버. 설정 주입 시 프로젝트의 조건을 체크할 수 있어서 프로젝트 별로 주입되는 설정을 다르게 할 수 있다.

관련 문법

  • Implementation / compile
    compile이랑 implementation일 때의 gradle 동작이 다른데,

    Compile - 해당 모듈과 직접 / 간접 의존하는 모든 모듈 재빌드
    Implementation - 해당 모듈과 직접 의존하는 모듈 재빌드

하지만 Gradle 3.0 버전 부터 compile이 deprecated 되었다고. 그래서 implementation을 쓰는게 좋다.



참고 포스팅


minzoovv
Written by@minzoovv
성장하고 있는 개바라기 입니다 :D

GitHubInstagram