1.1 Senarai pemalam untuk dibina dalam Maven

Perhimpunan dalam Maven boleh dikonfigurasikan dengan sangat fleksibel. Pembangun Maven telah mencipta berpuluh-puluh pemalam secara khusus, yang dengannya anda boleh mengkonfigurasi pelbagai binaan dengan sangat fleksibel. Yang paling popular daripada mereka ditunjukkan dalam jadual di bawah:

pasangkan Penerangan
1 maven-compiler-plugin Mengurus kompilasi Java
2 maven-resources-plugin Mengawal kemasukan sumber dalam perhimpunan
3 pemalam sumber maven Mengawal sama ada kod sumber disertakan dalam perhimpunan
4 maven-dependency-plugin Mengawal proses menyalin perpustakaan pergantungan
5 maven-jar-plugin Pemalam untuk mencipta fail balang akhir
6 plugin perang maven Plugin untuk mencipta fail perang terakhir
7 maven-surefire-plugin Menguruskan larian ujian
8 buildnumber-maven-plugin Menghasilkan nombor binaan

Setiap pemalam adalah menarik dengan cara tersendiri, tetapi kami perlu menganalisis semuanya. Mari kita mulakan dengan perkara utama - pemalam pengurusan kompilasi.

1.2 Pemalam kompilasi maven-compiler-plugin

Plugin paling popular yang membolehkan anda mengawal versi pengkompil dan digunakan dalam hampir semua projek ialah maven-compiler-plugin. Ia mempunyai tetapan lalai, tetapi dalam hampir setiap projek ia perlu ditetapkan semula.

Dalam versi paling mudah, dalam pemalam, anda perlu menentukan versi kod sumber Java dan versi mesin Java di mana pemasangan dijalankan:

<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>

Dalam contoh di atas, kami menetapkan tiga pilihan pengkompil Java: source, targetdan encoding.

Parameter sourcemembolehkan kami menetapkan versi Java untuk sumber kami. Parameter targetialah versi mesin Java di mana anda ingin menyusun kelas. Jika tiada kod atau versi mesin Java dinyatakan, maka lalai ialah 1.3

Akhir sekali, parameter encodingmembolehkan anda menentukan pengekodan fail Java. Kami menunjukkan UTF-8. Kini hampir semua sumber disimpan dalam UTF-8. Tetapi jika parameter ini tidak ditentukan, maka pengekodan semasa sistem pengendalian akan dipilih. Untuk Windows, ini ialah pengekodan Windows-1251.

Terdapat juga kes apabila komputer binaan mempunyai beberapa versi Java yang dipasang: untuk membina modul yang berbeza dan/atau projek yang berbeza. Dalam kes ini, JAVA_HOMEhanya laluan ke salah satu daripadanya boleh ditentukan dalam pembolehubah.

Di samping itu, terdapat pelbagai pelaksanaan mesin Java: OpenJDK, OracleJDK, Amazon JDK. Dan semakin besar projek itu, semakin kompleks strukturnya. Tetapi anda boleh secara eksplisit menetapkan laluan ke pengkompil javac untuk pemalam menggunakan teg . Ia telah ditambah khusus untuk majlis ini.

Pemalam maven-compiler-pluginmempunyai dua matlamat:

  • compiler:compile– penyusunan sumber, secara lalai dikaitkan dengan fasa penyusunan
  • compiler:testCompile– penyusunan ujian, secara lalai ia dikaitkan dengan fasa penyusunan ujian.

Anda juga boleh menentukan senarai hujah untuk dihantar kepada pengkompil javac pada baris arahan:

<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 Pemalam untuk mencipta fail jar maven-jar-plugin

Jika anda ingin membina perpustakaan balang anda sendiri dengan Maven, anda memerlukan maven-jar-plugin. Plugin ini melakukan banyak perkara yang berguna.

Contoh pemalam sedemikian:

<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, ia boleh digunakan untuk menentukan fail mana yang akan masuk ke perpustakaan dan mana yang tidak. Menggunakan teg <include>dalam bahagian, <includes>anda boleh menentukan senarai direktori yang kandungannya perlu ditambahkan pada pustaka .

Kedua, setiap balang mesti mempunyai manifes ( MANIFEST.MF file ). Pemalam itu sendiri akan meletakkannya di tempat yang betul dalam perpustakaan, anda hanya perlu menentukan laluan mana untuk mengambilnya. Tag digunakan untuk ini <manifestFile>.

Akhir sekali, pemalam boleh menjana manifes sendiri. Untuk melakukan ini, bukannya teg, <manifestFile>anda perlu menambah teg <manifest>dan menentukan data untuk manifes masa hadapan di dalamnya. Contoh:

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

Teg <addClasspath>menentukan sama ada untuk menambah manifes CLASSPATH.

Teg <classpathPrefix>membolehkan anda menambah awalan (dalam lib contoh) sebelum setiap sumber. Menentukan awalan dalam <classpathPrefix>membolehkan anda meletakkan kebergantungan dalam folder berasingan.

Ya, anda boleh meletakkan perpustakaan di dalam perpustakaan lain. Dan terdapat banyak kejutan menanti anda apabila anda perlu melepasi laluan ke fail hartanah di suatu tempat, iaitu dalam perpustakaan balang, yang terdapat dalam perpustakaan balang.

Akhirnya, teg <mainClass>menunjuk ke kelas boleh laku utama. “Apakah kelas boleh laku utama? ", - anda bertanya. Dan masalahnya ialah mesin Java boleh menjalankan program yang ditentukan bukan sahaja oleh kelas Java, tetapi juga oleh fail jar. Dan untuk kes ini kelas permulaan utama diperlukan.

1.4 Bina pemalam penjanaan nombor buildnumber-maven-plugin

Selalunya, perpustakaan jar dan fail perang menyertakan maklumat dengan nama projek dan versinya, serta versi pemasangan. Ini bukan sahaja berguna untuk mengurus kebergantungan, tetapi ia juga memudahkan ujian: adalah jelas dalam versi perpustakaan mana ralat itu diperbaiki dan di mana ia ditambah.

Selalunya, tugas ini diselesaikan seperti ini - mereka membuat fail khas application.propertiesyang mengandungi semua maklumat yang diperlukan dan memasukkannya ke dalam perhimpunan. Anda juga boleh mengkonfigurasi skrip binaan supaya data daripada fail ini berhijrah ke MANIFEST.MFdsb.

Tetapi apa yang paling menarik ialah Maven mempunyai pemalam khas yang boleh menjana fail application.properties sedemikian. Untuk melakukan ini, anda perlu membuat fail sedemikian dan mengisinya dengan templat data khas. Contoh:

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

Nilai ketiga-tiga parameter akan digantikan pada peringkat binaan.

Parameter pom.namedan pom.versionakan diambil terus daripada pom.xml. Dan untuk menjana nombor binaan unik dalam Maven, terdapat pemalam khas - buildnumber-maven-plugin. Lihat contoh di bawah:

<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 perkara penting berlaku. Pertama, pemalam itu sendiri ditentukan untuk menetapkan versi pemasangan . Kedua, dinyatakan bahawa ia akan dijalankan semasa fasa pengesahan (fasa pertama) dan menjana nombor binaan - ${buildNumber}.

Dan ketiga, format nombor pemasangan ini ditunjukkan, yang dilekatkan bersama dari beberapa bahagian . Ini ialah versi projek project.versiondan masa semasa yang diberikan oleh templat. Format templat ditentukan oleh kelas Java MessageFormat.