Build Automation dengan Apache Maven
Dalam tahapan pembuatan software ada beberapa hal yang pasti kita lalui seperti proses kompilasi, membuat distribution file, hingga menjalankan unit test. Semua tahapan itu bisa kita otomasi menggunakan tools yang disebut build automation. Salah satu tools build automation adalah Apache Maven.
Maven merupakan salah satu build automation yang bersifat free dan open-source. Karena Maven berjalan diatas JVM, maka Maven mendukung beberapa bahasa pemrograman seperti Java, Kotlin, Scala, Groovy, dll. Fitur utama dari Maven adalah sebagai berikut:
- membuat project
- kompilasi source code
- membuat distribution file
- membuat dokumentasi
- menjalankan automated test
- dan yang paling penting adalah dependency management
Archetype
Archetype merupakan project templating toolkit dari Maven. Dengan archetype kita bisa generate project berdasarkan template yang sudah ada. Maven menyediakan banyak sekali template yang siap pakai, kita juga bisa membuat template sesuai kebutuhan kita sendiri. Untuk membuat project Maven based on archetype berikut perintahnya:
mvn archetype:generate
Pada terminal/command-prompt kita akan diminta untuk memilih template project yang ingin kita gunakan, ada banyak sekali yang disediakan baik oleh Maven maupun dari pihak lain. Untuk awal kita bisa gunakan template maven-archetype-quickstart
. Kita juga akan diminta untuk mengisi beberapa informasi seperti:
groupId
nama identifikasi unik yang membedakan project kita dengan project orang lain. Untuk memastikan unik, biasanya diisi dengan domain seperticom-hiwijaya
.artifactId
nama dari project yang kita buat.version
versi dari project yang kita buat.package
default package pada project kita.
Hasil generate project dari Maven memiliki struktur seperti ini:
POM
Project Object Model atau pom.xml
merupakan file XML yang berisi informasi dan konfigurasi yang dibutuhkan Maven untuk build project kita. Di file ini juga kita deklarasikan dependency yang dibutuhkan untuk menjalankan project kita. Berikut contoh minimum tag yang wajib ada pada file pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- other tags -->
</project>
Untuk penjelasan lebih detail lagi mengenai pom.xml
, bisa dilihat disini.
Lifecycle
Maven bekerja dengan konsep lifecycle dimana proses building dan distribution artifact(project) didefinisikan dengan commands set dari lifecycle. Terdapat tiga built-in lifecycle secara umum:
- clean menghapus file dan direktori yang digenerate dari proses build sebelumnya, seperti menghapus direktori
target
. - default merupakan lifecycle utama yang bertanggung jawab untuk project deployment.
- site membuat dokumentasi project.
Masing-masing dari lifecycle terdiri dari list phase yang dieksekusi secara berurutan. Setiap phase bertanggung jawab pada task yang berbeda dan spesifik. Ada banyak sekali phase, berikut yang paling penting:
clean
menghapus file dan direktori(target) yang digenerate dari proses build sebelumnya.validate
memastikan semua informasi yang dibutuhkan Maven untuk proses build tersedia.compile
melakukan proses kompilasi source code.test-compile
melakukan kompilasi source code test.test
menjalankan unit test.package
membuat distribution file.install
menginstall project ke local repository, sehingga bisa digunakan oleh project lain.deploy
copy project ke remote repository.
mvn [phase-name...]
Dependency
Suatu aplikasi jarang sekali berdiri sendiri, sering sekali membutuhkan dukungan dari pihak lain seperti tools atau library. Ketika proses development, tanpa bantuan dari dependency management kita harus menambahkan library eksternal secara manual. Maven mendukung dependency management yang sangat membantu baik ketika masa development sampai tahap deployment.
Untuk menambahkan library eksternal ke project Maven, cukup dengan mendaftarkan dependency ke pom.xml
. Secara default pertama Maven akan mencari library tersebut di local repository, jika belum tersedia Maven akan men-download dari Maven Central Repository.
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
Setiap dependency yang didaftarkan di pom.xml
memiliki scope. Scope menentukan visibilitas dari dependency tersebut. Ada banyak scope di Maven, tapi yang paling sering digunakan adalah berikut:
compile
merupakan scope default. Dependency dengan scope ini akan digunakan pada build, test, dan run project.test
dependency dengan scope ini, hanya akan di-include pada bagian test project saja.
Build
Fungsi terakhir yang tidak kalah penting dari Maven yaitu membuat distribution file. Disini kita akan mem-bundle project kita berikut dengan semua dependency yang dibutuhkan menjadi satu file executable .jar
dengan bantuan plugin Maven maven-assembly-plugin
. Berikut konfigurasinya pada pom.xml
:
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.hiwijaya.maven.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
Setelah semua konfigurasi selesai, untuk membuat distribution filenya dengan cara menjalankan perintah:
mvn clean package assembly:single
ref: