Maven Enforcer Plugin
1. Visão geral
Neste tutorial, aprenderemos sobre oMaven Enforcer Plugin e como podemos usá-lo para garantir o nível de conformidade em nosso projeto.
O plugin é especialmente útil quando temos equipes distribuídas, espalhadas por todo o mundo.
2. Dependência
Para usar o plugin em nosso projeto, precisamos adicionar a seguinte dependência ao nossopom.xml:
org.apache.maven.plugins
maven-enforcer-plugin
3.0.0-M2
A última versão do plugin está disponível emMaven Central.
3. Configuração e objetivos do plugin
O Maven Enforcer tem dois objetivos:enforcer:enforce andenforcer:display-info.
A metaenforce é executada durante a construção de um projeto para executar regras especificadas na configuração, enquanto a metadisplay-info mostra informações atuais sobre as regras integradas que estão presentes empom.xml do projeto.
Vamos definir a metaenforce na tagexecutions. Além disso, vamos adicionar a tagconfiguration que contém as definiçõesrules para o projeto:
...
enforce
enforce
...
4. Regras do Maven Enforcer
A palavra-chaveenforce dá uma sugestão sutil da existência de regras a serem obedecidas. É assim que o plug-in do Maven Enforcer funciona. Nós o configuramos com algumas regras que devem ser aplicadas durante a fase de construção do projeto.
Nesta seção, veremos as regras disponíveis que podemos aplicar aos nossos projetos para melhorar sua qualidade.
4.1. Banir dependência duplicada
Em um projeto multimódulo, onde existe uma relação pai-filho entrePOMs, garantir que não haja duplicidade de dependência noPOM final efetivo para um projeto pode ser uma tarefa complicada. Mas, com a regrabanDuplicatePomDependencyVersions, podemos facilmente ter certeza de que nosso projeto está livre de tal falha.
Tudo o que precisamos fazer é adicionar a tagbanDuplicatePomDependencyVersions à seçãorules da configuração do plugin:
...
...
Para verificar o comportamento da regra, podemos duplicar uma dependência empom.xmle executarmvn clean compile. . Irá produzir as seguintes linhas de erro no console:
...
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDuplicatePomDependencyVersions failed with message:
Found 1 duplicate dependency declaration in this project:
- dependencies.dependency[io.vavr:vavr:jar] ( 2 times )
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.370 s
[INFO] Finished at: 2019-02-19T10:17:57+01:00
...
4.2. Requer versão Maven e Java
As regrasrequireMavenVersionerequireJavaVersion permitem um bloqueio em todo o projeto das versões necessárias do Maven e do Java, respectivamente. Isso ajudará a eliminar a disparidade que pode surgir ao usar diferentes versões do Maven e JDK em ambientes de desenvolvimento.
Vamos atualizar a seçãorules da configuração do plugin:
3.0
1.8
Isso nos permite especificar os números da versão de maneira flexível, desde que estejam em conformidade com osversion range specification pattern.
Além disso, ambas as regras também aceitam um parâmetromessage para especificar uma mensagem personalizada:
...
3.0
Invalid Maven version. It should, at least, be 3.0
...
4.3. Requer Variável de Ambiente
Com a regrarequireEnvironmentVariable, podemos garantir que uma determinada variável de ambiente seja definida no ambiente de execução.
Pode ser repetido para acomodar mais de uma variável necessária:
ui
cook
4.4. Requer Perfil Ativo
Os perfis no Maven nos ajudam a configurar propriedades que estarão ativas quando nosso aplicativo for implantado em ambientes diferentes.
Conseqüentemente, podemos usar a regrarequireActiveProfile quando precisamos garantir que um ou mais perfis especificados estejam ativos, garantindo assim a execução bem-sucedida de nosso aplicativo:
local,base
Missing active profiles
No snippet acima, usamos a propriedademessage para fornecer uma mensagem personalizada para mostrar se a verificação de regra falha.
4.5. Outras Regras
O plug-in Maven Enforcer tem muitosother rules para promover a qualidade e consistência do projeto, independentemente do ambiente de desenvolvimento.
Além disso, o plugin possui um comando para exibir informações sobre algumas regras atualmente configuradas:
mvn enforcer:display-info
5. Regras personalizadas
Até agora, exploramos as regras integradas do plugin. Agora, é hora de criar nossa própria regra personalizada.
Primeiro, precisamos criar um novo projeto Java que conterá nossa regra personalizada. Uma regra personalizada é uma classeObject queimplements the EnforceRule interface and overrides the execute() method:
public void execute(EnforcerRuleHelper enforcerRuleHelper) throws EnforcerRuleException {
try {
String groupId = (String) enforcerRuleHelper.evaluate("${project.groupId}");
if (groupId == null || !groupId.startsWith("org.example")) {
throw new EnforcerRuleException("Project group id does not start with org.example");
}
}
catch (ExpressionEvaluationException ex) {
throw new EnforcerRuleException( "Unable to lookup an expression "
+ ex.getLocalizedMessage(), ex );
}
}
Nossa regra personalizada simplesmente verifica se ogroupId do projeto de destino começa comorg.example ou não.
Observe como não temos que retornarboolean ou qualquer coisa para indicar que a regra não foi satisfeita. Acabamos de lançar umEnforcerRuleException com uma descrição do que está errado.
We can use our custom rule by adding it as a dependency to the Maven Enforcer plugin:
...
...
Observe que se o projeto de regra personalizada não for um artefato publicado no Maven Central, podemos instalá-lo no repositório Maven local executando omvn clean install.
Isso o disponibilizará ao compilar o projeto de destino que possui o plug-in Maven Enforcer. Por favor, veja osdocumentation for the custom rule do plugin para saber mais.
Para vê-lo em ação, podemos definir a propriedadegroupId do projeto com o plug-in do Enforcer para algo diferente de “org.example” e executarmvn clean compile.
6. Conclusão
Neste tutorial rápido, vimos como o Maven Enforcer Plugin pode ser uma adição útil ao nosso baú de plugins existente. A capacidade de escrever regras personalizadas aprimora seu alcance de aplicação.
Observe que precisamos remover o comentário das dependências e da regra para o exemplo de regra personalizada no exemplo de código-fonte completo que está disponívelover on GitHub.