개발하면서 오픈소스를 참조하다 보면 어느 프로젝트는 Maven을 사용하고 어느 프로젝트는 gradle, ant를 사용하는 프로젝트도 존재하는데 왜 빌드도구를 나누어 놓고 쓰는지에 대해 궁금하여 각 빌드 도구 별 장단점 기록
(나온순서 : ANT -> Maven -> Gradle)
Compare build tools(빌드도구 별 장단점 비교)
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>
→ ivy.xml로 ant의 의존성을 관리할 수 있음
ant의 단점을 보완하기 위해서 등장, 외부 라이브러리를 관리하고, 표준화된 포맷을 제공, 여전히 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>
포맷이 어느정도 있는 만큼, 복작합 빌드 스크립트를 커스텀하기 어렵다
build.gradle로 관리되고 xml대신 groovy언어를 사용, xml은 껍데기 태그가 많아 가독성이 떨어졌는데, groovy로 인해 많이 간결해졌다.
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()
}
오픈소스 마다 빌드도구가 다 다른 이유는 개발된 시기가 다르거나 예전 빌드도구를 사용하고 있는 것인데 빌도도구 별로 각 장단점은 존재하나 나온 순서대로 전 세대의 단점을 보안에서 나오는 게 대부분이라 새로 프로젝트를 만든다고 한다면 최신에 나온 것을 사용하자.