오픈소스마다 빌드도구가 왜 다른지?(ANT, MAVEN, GRADLE)

Better late than never·2022년 9월 1일
0

?

개발하면서 오픈소스를 참조하다 보면 어느 프로젝트는 Maven을 사용하고 어느 프로젝트는 gradle, ant를 사용하는 프로젝트도 존재하는데 왜 빌드도구를 나누어 놓고 쓰는지에 대해 궁금하여 각 빌드 도구 별 장단점 기록(나온순서 : ANT -> Maven -> Gradle)

Compare build tools(빌드도구 별 장단점 비교)

ANT

build.xml로 관리, 빌드 과정을 target으로 만들어 단계별로 수행

// build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 프로젝트 빌드용 Ant 스크립트. build.properties의 내용을 기본 설정으로 사용한다.-->
<project name="common" default="compile">
    <property name="src.dir" value="src" />
	 
  	<target name="clean">
        <delete dir="build"/>
    </target>

    <target name="compile">
        <mkdir dir="build/classes"/>
        <javac srcdir="src" destdir="build/classes"/>
    </target>

    <target name="jar">
        <mkdir dir="build/jar"/>
        <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="oata.HelloWorld"/>
            </manifest>
        </jar>
    </target>

    <target name="run">
        <java jar="build/jar/HelloWorld.jar" fork="true"/>
    </target>
</project>

단점

  • 프로젝트가 방대해지면 엄청 복잡해지고 규칙이 없어 개발자마다 스타일이 크게 차이가 날 수 도 있음
  • remote repository를 사용할 수 없음, maven이나 gradle을 사용할 때는 mavenrepository에서 의존성을 찾아서 넣어주기만 하면 되는데, ant는 이게 불가능하다. 직접 jar를 받아서 넣어줘야한다

→ ivy.xml로 ant의 의존성을 관리할 수 있음

결론

  • xml로 관리. 빌드 스크립트가 복잡함. 스크립트가 정형화되어있지 않아서 유지보수 어려움
  • 외부 라이브러리 관리 불가. (관리하기 위해서는 ivy가 필요)

MAVEN

ant의 단점을 보완하기 위해서 등장, 외부 라이브러리를 관리하고, 표준화된 포맷을 제공, 여전히 xml로 관리(pom.xml)

  • XML 사용
  • pom.xml을 이용한 정형화된 빌드 시스템
  • 자바용 프로젝트 관리 도구.
  • 아파치 앤트의 대안으로 만들어짐.
  • 아파치 라이센스로 배포된 오픈 소스 소프트웨어
// POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

단점

포맷이 어느정도 있는 만큼, 복작합 빌드 스크립트를 커스텀하기 어렵다

결론

  • xml로 관리. 빌드 스크립트가 정형화되어있음. 복잡한 빌드 스크립트를 커스텀하기 어려움.
  • 외부 라이브러리 관리 해줌
  • 멀티 프로젝트 사용 시 상속 방식으로 지원

GRADLE

build.gradle로 관리되고 xml대신 groovy언어를 사용, xml은 껍데기 태그가 많아 가독성이 떨어졌는데, groovy로 인해 많이 간결해졌다.

  • Groovy 사용
  • build.gradle을 이용한 정형화된 빌드 시스템.
  • 안드로이드 앱 공식 빌드 시스템.
  • 빌드 속도가 maven에 비해 10~100배 가량 빠름.
  • JAVA, C/C++, Python등을 지원.
  • 빌드툴인 Ant Builder와 Groovy 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용 가능.
plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

장점

  • gradle은 캐싱을 하기때문에 빌드 속도가 빠르다. gradle만 쓰면 못느낄수도 있지만 ant를 써보면 확실하게 느껴진다
  • gradle은 멀티 프로젝트 빌드가 가능하다. maven은 이를 상속구조로 가져간다고 한다. gradle과 maven에서 멀티 프로젝트를 해보진 않았지만, ant에서는 각 프로젝트마다 빌드해서 사용하고있다. gradle은 멀티 빌드로 자동화

결론

  • groovy 언어 사용
  • 캐싱으로 속도가 빠르다.
  • 멀티 프로젝트 빌드를 지원한다.

0개의 댓글