1.1 Lista de plugins para construir no Maven

A montagem no Maven pode ser configurada de forma muito flexível. Os desenvolvedores do Maven criaram dezenas de plug-ins especialmente, usando os quais você pode configurar várias compilações com muita flexibilidade. Os mais populares deles são mostrados na tabela abaixo:

plugar Descrição
1 maven-compiler-plugin Gerencia a compilação Java
2 maven-resources-plugin Controla a inclusão de recursos em um assembly
3 plug-in fonte maven Controla se o código-fonte está incluído em um assembly
4 plugin-dependência-maven Controla o processo de cópia de bibliotecas de dependência
5 maven-jar-plugin Plugin para criar arquivo jar final
6 plug-in de guerra maven Plugin para criar o arquivo war final
7 maven-surefire-plugin Gerencia execuções de teste
8 buildnumber-maven-plugin Gera um número de compilação

Cada plugin é interessante à sua maneira, mas teremos que analisá-los todos. Vamos começar com o principal - o plug-in de gerenciamento de compilação.

1.2 Plugin de compilação maven-compiler-plugin

O plugin mais popular que permite controlar a versão do compilador e é usado em quase todos os projetos é o maven-compiler-plugin. Possui configurações padrão, mas em quase todos os projetos elas precisam ser definidas novamente.

Na versão mais simples, no plug-in, você precisa especificar a versão do código-fonte Java e a versão da máquina Java sob a qual a montagem é realizada:

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

No exemplo acima, definimos três opções do compilador Java: source, targete encoding.

O parâmetro sourcenos permite definir a versão do Java para nossas fontes. O parâmetro targeté a versão da máquina Java sob a qual você deseja compilar as classes. Se nenhum código ou versão da máquina Java for especificado, o padrão será 1.3

Por fim, o parâmetro encodingpermite especificar a codificação dos arquivos Java. Nós indicamos UTF-8. Agora quase todas as fontes são armazenadas em UTF-8. Mas se este parâmetro não for especificado, a codificação atual do sistema operacional será selecionada. Para Windows, esta é a codificação Windows-1251.

Existem também casos em que o computador de construção possui várias versões do Java instaladas: para construir diferentes módulos e/ou diferentes projetos. Neste caso, JAVA_HOMEapenas o caminho para um deles pode ser especificado na variável.

Além disso, existem diferentes implementações da máquina Java: OpenJDK, OracleJDK, Amazon JDK. E quanto maior o projeto, mais complexa sua estrutura. Mas você pode definir explicitamente o caminho para o compilador javac para o plug-in usando a tag . Foi adicionado especificamente para esta ocasião.

O plugin maven-compiler-plugintem dois objetivos:

  • compiler:compile– compilação de fontes, por padrão associada à fase de compilação
  • compiler:testCompile– compilação de testes, por padrão está associada à fase de compilação de teste.

Você também pode especificar uma lista de argumentos a serem passados ​​para o compilador javac na linha de comando:

<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 para criar arquivo jar maven-jar-plugin

Se você quiser construir sua própria biblioteca jar com Maven, você precisará do maven-jar-plugin. Este plugin faz muitas coisas úteis.

Um exemplo de tal plugin:

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

Primeiro, pode ser usado para especificar quais arquivos entrarão na biblioteca e quais não. Usando tags <include>na seção, <includes>você pode especificar uma lista de diretórios cujo conteúdo precisa ser adicionado à biblioteca .

Em segundo lugar, cada jar deve ter um manifesto ( arquivo MANIFEST.MF ). O próprio plug-in irá colocá-lo no lugar certo na biblioteca, você só precisa especificar qual caminho seguir. A tag é usada para isso <manifestFile>.

Por fim, o plug-in pode gerar um manifesto por conta própria. Para fazer isso, em vez de uma tag, <manifestFile>você precisa adicionar uma tag <manifest>e especificar dados para o futuro manifesto nela. Exemplo:

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

A tag <addClasspath>especifica se deseja adicionar ao manifesto CLASSPATH.

A tag <classpathPrefix>permite adicionar um prefixo (no exemplo lib) antes de cada recurso. Especificar um prefixo em <classpathPrefix>permite que você coloque as dependências em uma pasta separada.

Sim, você pode colocar bibliotecas dentro de outra biblioteca. E há muitas surpresas esperando por você quando precisar passar o caminho para o arquivo de propriedades em algum lugar, que está na biblioteca jar, que está na biblioteca jar.

Por fim, a tag <mainClass>aponta para a classe executável principal. “Qual é a classe executável principal? ", - você pergunta. E o fato é que uma máquina Java pode executar um programa especificado não apenas por uma classe Java, mas também por um arquivo jar. E é para este caso que a classe inicial principal é necessária.

1.4 Plug-in de geração de número de compilação buildnumber-maven-plugin

Muitas vezes, bibliotecas jar e arquivos war incluem informações com o nome do projeto e sua versão, bem como a versão do assembly. Isso não é apenas útil para gerenciar dependências, mas também simplifica o teste: fica claro em qual versão da biblioteca o erro foi corrigido e em qual ele foi adicionado.

Na maioria das vezes, essa tarefa é resolvida assim - eles criam um arquivo especial application.propertiesque contém todas as informações necessárias e o incluem na montagem. Você também pode configurar o script de construção para que os dados desse arquivo migrem para MANIFEST.MFetc.

Mas o mais interessante é que o Maven possui um plug-in especial que pode gerar esse arquivo application.properties. Para fazer isso, você precisa criar esse arquivo e preenchê-lo com modelos de dados especiais. Exemplo:

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

Os valores de todos os três parâmetros serão substituídos no estágio de construção.

Parâmetros pom.namee pom.versionserão obtidos diretamente de pom.xml. E para gerar um número de compilação exclusivo no Maven, existe um plug-in especial - buildnumber-maven-plugin. Veja exemplo abaixo:

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

No exemplo acima, três coisas importantes acontecem. Primeiro, o próprio plug-in é especificado para definir a versão do assembly . Em segundo lugar, é especificado que ele será executado durante a fase de validação (a primeira fase) e gerará um número de compilação - ${buildNumber}.

E em terceiro lugar, é indicado o formato desse número de montagem, que é colado de várias partes . Esta é a versão do projeto project.versione a hora atual fornecida pelo modelo. O formato do modelo é especificado pela classe Java MessageFormat.