Continuando a responder a pergunta “para que serve o apache maven?” nesse post eu explico a estrutura básica de um arquivo POM. O POM é um dos arquivos mais importantes em um projeto Maven, ele descreve uma série de configurações que o projeto terá e quais repositórios e dependências seu projeto irá precisar.
No cabeçalho de um POM temos algumas tags básicas que definem qual versão do modelo de POM utilizado. O seu GroupId que seria algo como o prefixo da estrutura de pacotes do projeto. O ArtifactId que define qual é o nome o artefato final .war ou .jar terá quando empacotado. Version define a versão do projeto que irá complementar o nome do artefato. A tag Packaging por sua vez define qual tipo de empacotamento o projeto terá após o processo de build, no nosso caso será um .war. E a tag Name define o nome do projeto.
<modelVersion>4.0.0</modelVersion> <groupId>br.com.semeru</groupId> <artifactId>semeru_jsf_maven</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>semeru_jsf_maven</name>
A tag Properties possibilita definir por exemplo a versão do Spring, ou do JSF adotada para o projeto. Se uma dependência for definida como no trecho de código abaixo ao mudarmos a versão do Spring, por exemplo, para 3.1 todas as dependências serão baixadas para a versão 3.1. Podemos definir o contêiner web no qual será feito o deploy da aplicação (Tomcat) e também o tipo de codificação utilizada pelo projeto, no nosso caso o UTF8 .
<properties> <spring.version>3.0.5.RELEASE</spring.version> <themes.version>1.0.8</themes.version> <jsf.version>2.1.7</jsf.version> <jstl.version>1.2</jstl.version> <netbeans.hint.deploy.server>Tomcat</netbeans.hint.deploy.server> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
A tag Repositories define a lista de repositórios que serão acessados pelo Maven para baixar nossas dependencias. Muitas vezes é necessário colocar um repositório prioritário no inicio do POM para que o Maven inicie a busca pelas dependências a partir dele.
<repositories> <!-- PRIMEFACES REPOSITORY --> <repository> <id>prime-repo</id> <name>PrimeFaces Maven Repository</name> <url>http://repository.primefaces.org</url> <layout>default</layout> </repository> <!-- FACELETS TAGLIBRARIES REPOSITORY --> <repository> <id>org.springframework.security.taglibs.facelets</id> <url>http://spring-security-facelets-taglib.googlecode.com/svn/repo/</url> </repository> </repositories>
A tag dependencies define quais serão as dependências utilizadas no projeto no trecho de código abaixo declaramos algumas das dependências necessárias para se trabalhar com JavaServer Faces.
<dependencies> <!-- || DEPENDÊNCIAS DO JAVA SERVER FACES || --> <!-- ############## JSF-API ################ --> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-api</artifactId> <version>${jsf.version}</version> <scope>compile</scope> </dependency> <!-- ############## JSF-IMPL ############### --> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>${jsf.version}</version> </dependency> <!-- ################ JSTL ################# --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> </dependencies>
Muitas vezes algumas dependências precisam ser excluídas. Isso acontece por vários motivos primeiro pode ser que o projeto já utilize uma versão diferente da mesma dependência. Um segundo motivo pode ser o fato da dependência em questão gerar conflitos com outras utilizadas no projeto. A sintaxe para remover uma dependência é como o trecho de código abaixo. Nele estamos declarando a dependência do DOM4J mas estamos dizendo ao Maven para não baixar a dependência da XML-APIS. Se tirarmos essa exclusão o Maven vai analizar o POM da DOM4J e verificará que ela possui uma dependência da XML-APIS e assim entenderá que o projeto necessita dela e irá baixá-la para nosso .m2.
<!-- ############### DOM4J ################# --> <dependency> <artifactId>dom4j</artifactId> <groupId>dom4j</groupId> <type>jar</type> <version>1.6.1</version> <exclusions> <exclusion> <artifactId>xml-apis</artifactId> <groupId>xml-apis</groupId> </exclusion> </exclusions> </dependency>
Anteriormente no post Entendendo o Apache Maven eu expliquei outros detalhes importantes do Maven além disso no GUJ tem um tutorial bem legal sobre o assunto.