/blog/*

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 seperti com-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:

Maven Project Structure

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: