1.1 Daftar plugin yang akan dibangun di Maven

Rakitan di Maven dapat dikonfigurasi dengan sangat fleksibel. Pengembang Maven telah secara khusus membuat lusinan plugin, yang dengannya Anda dapat mengonfigurasi berbagai build dengan sangat fleksibel. Yang paling populer ditunjukkan pada tabel di bawah ini:

plugin Keterangan
1 maven-kompiler-plugin Mengelola kompilasi Java
2 maven-resources-plugin Mengontrol penyertaan sumber daya dalam sebuah rakitan
3 plugin sumber maven Mengontrol apakah kode sumber disertakan dalam rakitan
4 maven-ketergantungan-plugin Mengontrol proses penyalinan pustaka dependensi
5 maven-jar-plugin Plugin untuk membuat file jar terakhir
6 plugin perang maven Plugin untuk membuat file perang terakhir
7 maven-pasti-plugin Mengelola uji coba
8 buildnumber-maven-plugin Menghasilkan nomor build

Setiap plugin menarik dengan caranya sendiri, tetapi kami harus menganalisis semuanya. Mari kita mulai dengan hal utama - plugin manajemen kompilasi.

1.2 Penyusunan plugin maven-compiler-plugin

Plugin paling populer yang memungkinkan Anda mengontrol versi kompiler dan digunakan di hampir semua proyek adalah maven-compiler-plugin. Ini memiliki pengaturan default, tetapi di hampir setiap proyek mereka perlu diatur lagi.

Dalam versi paling sederhana, di plug-in, Anda perlu menentukan versi kode sumber Java dan versi mesin Java tempat perakitan dilakukan:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <source>1.11</source>
        <target>1.13</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

Pada contoh di atas, kami menetapkan tiga opsi kompiler Java: source, targetdan encoding.

Parameter sourcememungkinkan kita menyetel versi Java untuk sumber kita. Parameternya targetadalah versi mesin Java tempat Anda ingin mengkompilasi kelas. Jika tidak ada kode atau versi mesin Java yang ditentukan, maka standarnya adalah 1.3

Terakhir, parameter encodingmemungkinkan Anda untuk menentukan penyandian file Java. Kami menunjukkan UTF-8. Sekarang hampir semua sumber disimpan di UTF-8. Tetapi jika parameter ini tidak ditentukan, pengkodean sistem operasi saat ini akan dipilih. Untuk Windows, ini adalah penyandian Windows-1251.

Ada juga kasus ketika komputer build memiliki beberapa versi Java yang terinstal: untuk membuat modul yang berbeda dan/atau proyek yang berbeda. Dalam hal ini, JAVA_HOMEhanya jalur ke salah satunya yang dapat ditentukan dalam variabel.

Selain itu, ada implementasi berbeda dari mesin Java: OpenJDK, OracleJDK, Amazon JDK. Dan semakin besar proyeknya, semakin kompleks strukturnya. Tapi Anda bisa secara eksplisit menyetel jalur ke kompiler javac untuk plugin menggunakan tag . Itu ditambahkan khusus untuk kesempatan ini.

Plugin ini maven-compiler-pluginmemiliki dua tujuan:

  • compiler:compile– kompilasi sumber, secara default terkait dengan fase kompilasi
  • compiler:testCompile– kompilasi tes, secara default dikaitkan dengan fase kompilasi tes.

Anda juga dapat menentukan daftar argumen yang akan diteruskan ke kompiler javac pada baris perintah:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-Xlint:all,-options,-path<arg>
        </compilerArgs>
    </configuration>
</plugin>

1.3 Plugin untuk membuat file jar maven-jar-plugin

Jika Anda ingin membangun perpustakaan jar Anda sendiri dengan Maven, Anda memerlukan plugin maven-jar. Plugin ini melakukan banyak hal berguna.

Contoh plugin seperti itu:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <includes>
            <include>**/properties/*</include>
        </includes>
        <archive>
           <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
</plugin>

Pertama, dapat digunakan untuk menentukan file mana yang akan masuk ke perpustakaan dan mana yang tidak. Menggunakan tag <include>di bagian tersebut, <includes>Anda dapat menentukan daftar direktori yang kontennya perlu ditambahkan ke pustaka .

Kedua, setiap toples harus memiliki manifes ( MANIFEST.MF file ). Plugin itu sendiri akan meletakkannya di tempat yang tepat di perpustakaan, Anda hanya perlu menentukan jalur mana yang akan diambil. Tag digunakan untuk ini <manifestFile>.

Terakhir, plugin dapat membuat manifes sendiri. Untuk melakukan ini, alih-alih tag, <manifestFile>Anda perlu menambahkan tag <manifest>dan menentukan data untuk manifes mendatang di dalamnya. Contoh:

<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.codegym.MainApplication</mainClass>
        </manifest>
    </archive>
</configuration>

Tag <addClasspath>menentukan apakah akan ditambahkan ke manifes CLASSPATH.

Tag <classpathPrefix>memungkinkan Anda menambahkan awalan (dalam contoh lib) sebelum setiap sumber daya. Menentukan awalan di <classpathPrefix>memungkinkan Anda menempatkan dependensi di folder terpisah.

Ya, Anda dapat menempatkan perpustakaan di dalam perpustakaan lain. Dan ada banyak kejutan yang menunggu Anda ketika Anda harus melewati jalur ke file properti di suatu tempat, yaitu di pustaka jar, yang ada di pustaka jar.

Terakhir, tag <mainClass>menunjuk ke kelas utama yang dapat dieksekusi. “Apa kelas utama yang dapat dieksekusi? ", - Anda bertanya. Dan masalahnya adalah mesin Java dapat menjalankan program yang ditentukan tidak hanya oleh kelas Java, tetapi juga oleh file jar. Dan untuk kasus inilah kelas awal utama diperlukan.

1.4 Bangun plugin penghasil angka buildnumber-maven-plugin

Sangat sering, pustaka jar dan file perang menyertakan informasi dengan nama proyek dan versinya, serta versi rakitan. Ini tidak hanya berguna untuk mengelola dependensi, tetapi juga menyederhanakan pengujian: jelas di versi pustaka mana kesalahan diperbaiki dan di mana ditambahkan.

Paling sering, tugas ini diselesaikan seperti ini - mereka membuat file khusus application.propertiesyang berisi semua informasi yang diperlukan dan memasukkannya ke dalam rakitan. Anda juga dapat mengonfigurasi skrip build sehingga data dari file ini bermigrasi ke MANIFEST.MFdll.

Namun yang paling menarik adalah Maven memiliki plugin khusus yang dapat menghasilkan file application.properties semacam itu. Untuk melakukan ini, Anda perlu membuat file seperti itu dan mengisinya dengan templat data khusus. Contoh:

# application.properties
app.name=${pom.name}
app.version=${pom.version}
app.build=${buildNumber}

Nilai dari ketiga parameter tersebut akan diganti pada tahap build.

Parameter pom.namedan pom.versionakan diambil langsung dari pom.xml. Dan untuk menghasilkan nomor build unik di Maven, ada plugin khusus - buildnumber-maven-plugin. Lihat contoh di bawah ini:

<packaging>war</packaging>
<version>1.0</version>
<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.2</version>
        <executions>
            <execution>
                <phase>validate</phase>
                <goals>
                    <goal>create</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <revisionOnScmFailure>true</revisionOnScmFailure>
            <format>{0}-{1,date,yyyyMMdd}</format>
            <items>
                 <item>${project.version}</item>
                 <item>timestamp</item>
            </items>
        </configuration>
    </plugin>
</plugins>

Dalam contoh di atas, tiga hal penting terjadi. Pertama, plugin itu sendiri ditentukan untuk menyetel versi rakitan . Kedua, ditentukan bahwa itu akan berjalan selama fase validasi (fase pertama) dan menghasilkan nomor build - ${buildNumber}.

Dan ketiga, format nomor rakitan ini ditunjukkan, yang direkatkan dari beberapa bagian . Ini adalah versi proyek project.versiondan waktu saat ini yang diberikan oleh template. Format template ditentukan oleh kelas Java MessageFormat.