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.