1.1 Lista wtyczek do zbudowania w Maven

Montaż w Maven można konfigurować bardzo elastycznie. Programiści Maven specjalnie stworzyli dziesiątki wtyczek, za pomocą których można bardzo elastycznie konfigurować różne buildy. Najpopularniejsze z nich przedstawia poniższa tabela:

podłącz Opis
1 maven-compiler-plugin Zarządza kompilacją Java
2 maven-resources-plugin Kontroluje włączenie zasobów do zestawu
3 Wtyczka źródłowa maven Kontroluje, czy kod źródłowy jest zawarty w zestawie
4 maven-dependency-plugin Kontroluje proces kopiowania bibliotek zależności
5 maven-jar-plugin Wtyczka do tworzenia końcowego pliku jar
6 plugin do wojny maven Wtyczka do tworzenia ostatecznego pliku wojny
7 maven-surefire-plugin Zarządza przebiegami testów
8 buildnumber-maven-plugin Generuje numer kompilacji

Każda wtyczka jest interesująca na swój sposób, ale będziemy musieli przeanalizować je wszystkie. Zacznijmy od najważniejszej rzeczy - wtyczki do zarządzania kompilacją.

1.2 Wtyczka do kompilacji maven-compiler-plugin

Najpopularniejszą wtyczką, która pozwala kontrolować wersję kompilatora i jest używana w prawie wszystkich projektach, jest rozszerzenie maven-compiler-plugin. Ma ustawienia domyślne, ale w prawie każdym projekcie trzeba je ustawić od nowa.

W najprostszej wersji we wtyczce należy określić wersję kodu źródłowego Javy oraz wersję maszyny Javy, na której przeprowadzany jest montaż:

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

W powyższym przykładzie ustawiliśmy trzy opcje kompilatora Javy: source, targeti encoding.

Parametr sourcepozwala nam ustawić wersję Java dla naszych źródeł. Parametr targetto wersja maszyny Java, na której chcesz skompilować klasy. Jeśli nie określono kodu ani wersji maszyny Java, wartością domyślną jest 1.3

Wreszcie parametr encodingpozwala określić kodowanie plików Java. wskazaliśmy UTF-8. Teraz prawie wszystkie źródła są przechowywane w formacie UTF-8. Ale jeśli ten parametr nie zostanie określony, zostanie wybrane bieżące kodowanie systemu operacyjnego. W systemie Windows jest to kodowanie Windows-1251.

Zdarzają się również przypadki, gdy komputer budujący ma zainstalowane kilka wersji Javy: do budowania różnych modułów i/lub różnych projektów. W takim przypadku JAVA_HOMEw zmiennej można podać tylko ścieżkę do jednego z nich.

Ponadto istnieją różne implementacje maszyny Java: OpenJDK, OracleJDK, Amazon JDK. A im większy projekt, tym bardziej złożona jest jego struktura. Ale możesz jawnie ustawić ścieżkę do kompilatora javac dla wtyczki za pomocą tagu . Został dodany specjalnie na tę okazję.

Wtyczka maven-compiler-pluginma dwa cele:

  • compiler:compile– kompilacja źródeł, domyślnie powiązana z fazą kompilacji
  • compiler:testCompile– kompilacja testów, domyślnie jest powiązana z fazą test-compile.

Możesz także określić listę argumentów, które mają zostać przekazane kompilatorowi javac w wierszu poleceń:

<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 Wtyczka do tworzenia pliku jar maven-jar-plugin

Jeśli chcesz zbudować własną bibliotekę słoików za pomocą Mavena, będziesz potrzebować wtyczki maven-jar. Ta wtyczka robi wiele przydatnych rzeczy.

Przykład takiej wtyczki:

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

Po pierwsze, można go użyć do określenia, które pliki trafią do biblioteki, a które nie. Za pomocą tagów <include>w sekcji <includes>możesz określić listę katalogów, których zawartość ma zostać dodana do biblioteki .

Po drugie, każdy słoik musi mieć manifest ( plik MANIFEST.MF ). Wtyczka sama umieści ją w odpowiednim miejscu w bibliotece, trzeba tylko określić, którą ścieżką ją obrać. Służy do tego tag <manifestFile>.

Wreszcie wtyczka może samodzielnie wygenerować manifest. Aby to zrobić, zamiast tagu <manifestFile>musisz dodać tag <manifest>i określić w nim dane do przyszłego manifestu. Przykład:

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

Tag <addClasspath>określa, czy dodać do manifestu CLASSPATH.

Tag <classpathPrefix>umożliwia dodanie prefiksu (w przykładowej bibliotece) przed każdym zasobem. Określenie prefiksu w <classpathPrefix>umożliwia umieszczenie zależności w osobnym folderze.

Tak, możesz umieścić biblioteki w innej bibliotece. I czeka na Ciebie wiele niespodzianek, gdy trzeba gdzieś przekazać ścieżkę do pliku właściwości, czyli w bibliotece jar, która jest w bibliotece jar.

Wreszcie znacznik <mainClass>wskazuje na główną klasę pliku wykonywalnego. „Jaka jest główna klasa wykonywalna? ", - ty pytasz. Chodzi o to, że maszyna Java może uruchomić program, który jest określony nie tylko przez klasę Java, ale także przez plik jar. I właśnie w tym przypadku potrzebna jest główna klasa początkowa.

1.4 Wtyczka do generowania numerów kompilacji buildnumber-maven-plugin

Bardzo często biblioteki jar i pliki wojen zawierają informacje z nazwą projektu i jego wersją, a także wersją asemblera. Jest to nie tylko przydatne do zarządzania zależnościami, ale także upraszcza testowanie: jasne jest, w której wersji biblioteki błąd został naprawiony, aw której został dodany.

Najczęściej to zadanie jest rozwiązywane w ten sposób - tworzą specjalny plik application.propertieszawierający wszystkie niezbędne informacje i dołączają go do zestawu. Możesz także skonfigurować skrypt kompilacji, aby dane z tego pliku migrowały do MANIFEST.MF​​itp.

Ale najciekawsze jest to, że Maven ma specjalną wtyczkę, która może wygenerować taki plik application.properties. Aby to zrobić, musisz utworzyć taki plik i wypełnić go specjalnymi szablonami danych. Przykład:

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

Wartości wszystkich trzech parametrów zostaną podstawione na etapie kompilacji.

Parametry pom.namei pom.versionzostaną pobrane bezpośrednio z pliku pom.xml. Aby wygenerować unikalny numer kompilacji w Maven, dostępna jest specjalna wtyczka - buildnumber-maven-plugin. Zobacz przykład poniżej:

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

W powyższym przykładzie zachodzą trzy ważne rzeczy. Po pierwsze, sama wtyczka jest określona do ustawiania wersji asemblera . Po drugie, określono, że będzie działać podczas fazy walidacji (pierwsza faza) i wygeneruje numer kompilacji - ${buildNumber}.

I po trzecie, wskazany jest format tego numeru zespołu, który jest sklejony z kilku części . Jest to wersja projektu project.versioni aktualny czas podany przez szablon. Format szablonu jest określony przez klasę Java MessageFormat.