<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.caelum.com.br &#187; gerenciamento</title>
	<atom:link href="http://blog.caelum.com.br/tag/gerenciamento/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Processo de build com o Maven</title>
		<link>http://blog.caelum.com.br/processo-de-build-com-o-maven/</link>
		<comments>http://blog.caelum.com.br/processo-de-build-com-o-maven/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 18:26:39 +0000</pubDate>
		<dc:creator>Lucas Cavalcanti</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[dependências]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[gerenciamento]]></category>
		<category><![CDATA[integração contínua]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[pom.xml]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/07/07/processo-de-build-com-o-maven/</guid>
		<description><![CDATA[O Maven é uma ferramenta de gerenciamento, construção e implantação de projetos muito interessante, que te ajuda no processo de gerenciamento de dependências e no de build, geração de relatórios e de documentação. Na Caelum esta é a ferramenta usada em todos os projetos internos e nas consultorias. Muitas pessoas migram seus projetos para o <a href="http://blog.caelum.com.br/processo-de-build-com-o-maven/#more-222'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://maven.apache.org/">Maven</a> é uma ferramenta de gerenciamento, construção e implantação de projetos muito interessante, que te ajuda no processo de gerenciamento de dependências e no de build, geração de relatórios e de documentação. Na Caelum esta é a ferramenta usada em todos os projetos internos e nas consultorias.</p>
<p>Muitas pessoas migram seus projetos para o Maven, mas acabam arrumando mais problemas que soluções, pois não conseguem configurá-lo corretamente, e acabam desistindo e fazendo tudo na mão, ou voltando para o Ant. Mas se você conseguir ajustar as configurações, o Maven vai te ajudar muito e vai compensar todos os (poucos) problemas que ele eventualmente causa. No início do uso do Maven, espere formar com ele uma relação de amor e ódio.</p>
<p>Para começar a usar o Maven, tudo o que você precisa fazer é <a href="http://maven.apache.org/download.html">baixá-lo e configurar umas poucas variáveis de ambiente</a>. Depois de ter feito isso, é só digitar <code>mvn [target]</code> na linha de comando. Alguns sistemas operacionais já te oferecem essa instalação através do <code>macport</code> ou <code>apt-get</code>.</p>
<p>A unidade básica de configuração do Maven é um arquivo chamado <a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html">pom.xml</a>, que deve ficar na raiz do seu projeto. Ele é um arquivo conhecido como <em>Project Object Model</em>: lá você declara a estrutura, dependências e características do seu projeto. A idéia é bem parecida com o build.xml do Ant: você deixa o pom.xml na raiz do seu projeto para poder chamar as targets de build do seu projeto. O <a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Minimal_POM">menor arquivo pom.xml</a> válido é o seguinte:<br />
<code><br />
&lt;project&gt;<br />
&nbsp;&nbsp;&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br />
&nbsp;&nbsp;&lt;groupId&gt;br.com.caelum&lt;/groupId&gt;<br />
&nbsp;&nbsp;&lt;artifactId&gt;teste&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&lt;version&gt;1.0&lt;/version&gt;<br />
&lt;/project&gt;<br />
</code></p>
<p>Que contém apenas a identificação do projeto, e uma informação a mais: <code>modelVersion</code>, que é a identificação da versão do arquivo pom.xml e deve ser sempre 4.0.0. A identificação do projeto consiste em três informações:</p>
<ul>
<li><code>groupId</code>: um identificador da empresa/grupo ao qual o projeto pertence. Geralmente o nome do site da empresa/grupo ao contrário. Ex: <code>br.com.caelum</code>.</li>
<li><code>artifactId</code>: o nome do projeto. Ex: <code>teste</code>.</li>
<li><code>version</code>: a versão atual do projeto. Ex: <code>1.0-SNAPSHOT</code>.</li>
</ul>
<p>Essas informações são usadas em muitos lugares, ccomo o controle de dependências que é, na minha opinião, a funcionalidade mais útil do Maven. Por exemplo, para dizer que o log4j 1.2.15 é uma dependência da sua aplicação é só acrescentar no seu pom as linhas:<br />
<code><br />
&lt;project&gt;<br />
...<br />
&nbsp;&nbsp;&lt;dependencies&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;log4j&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;log4j&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;1.2.15&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/dependency&gt;<br />
&nbsp;&nbsp;&lt;/dependencies&gt;<br />
...<br />
&lt;/project&gt;<br />
</code><br />
Quando necessário, o Maven vai baixar pra você o jar do log4j 1.2.15, e todas as suas dependências, e vai colocá-las no classpath da sua aplicação durante os builds, testes, etc. Ou seja, você não precisa mais entrar no site do log4j, baixar um zip com vários jars e ter que procurar quais jars devem ser colocados no classpath! No <a href="http://mvnrepository.com">Repositório de Bibliotecas do Maven</a> você encontra os jars que você pode colocar como dependência do seu projeto, e o pedaço de xml que você deve copiar e colar dentro da tag dependencies do seu pom para incluir essas bibliotecas.</p>
<p>Todos os jars baixados pelo Maven são guardados na pasta <code>repository</code> dentro da <code>M2_HOME</code> que você configurou quando instalou o Maven. Assim, se mais de um projeto seu depende do mesmo jar, ele não é baixado de novo.</p>
<p>A <strong>grande</strong> diferença entre o <code>build.xml</code> do Ant e o <code>pom.xml</code> do Maven é o paradigma. No Ant usamos esse XML praticamente como uma linguagem de programação, onde você da comandos em relação ao build do projeto. No Maven usamos o XML para definir a estrutura do projeto, e a partir dessas declarações o Maven possui targets bem definidos que usam essas informações para saber como realizar aquela tarefa. Um exemplo: para compilar com o Ant criamos um target que chama o javac, mas para compilar com o Maven usamos um target já existente (não o criamos), e ele vai usar a informação que define onde está o código fonte e para onde ele deve ser compilado (sendo que muitas dessas informações possuem convenções e defaults, e nem precisam ser configuradas).</p>
<p>Além dos principais targets do Maven, você pode executar targets de plugins. Você só precisa digitar na linha de comando:</p>
<p><code>mvn [nomedoplugin]:[target]</code></p>
<p>e então o Maven baixa o plugin, se necessário, e executa a target pra você. Existe uma lista bem grande de <a href="http://maven.apache.org/plugins/index.html">plugins do Maven</a> e uma boa parte desses plugins podem ser usados sem nenhuma configuração adicional no seu <em>pom</em>.</p>
<p>Para dar um exemplo de plugin do Maven nada melhor do que o plugin que cria um protótipo de projeto do Maven: o <a href="http://maven.apache.org/plugins/maven-archetype-plugin/">Archetype</a>. É bem parecido com o scaffold do Ruby: ele cria um protótipo de projeto a partir de um modelo escolhido. O jeito mais fácil de usar esse plugin é digitando na linha de comando:</p>
<p><code>mvn archetype:create</code></p>
<p>E então o Archetype <a href="http://maven.apache.org/plugins/maven-archetype-plugin/usage.html">vai perguntar</a> qual é o tipo de projeto que você deseja, o groupID, artifactID, version e o pacote referentes ao seu projeto. Depois disso você terá uma estrutura de projeto pronta para ser usada.<br />
Por exemplo se você escolheu o tipo de projeto maven-archetype-quickstart, o Archetype vai criar uma estrutura de pastas parecidas com a seguinte:</p>
<pre><code>
teste
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- br
    |           `-- com
    |               `-- caelum
    |                   `-- teste
    |                       `-- App.java
    `-- test
        `-- java
            `-- br
                `-- com
                    `-- caelum
                        `-- teste
                            `-- AppTest.java
</code></pre>
<p>E então é só continuar o seu projeto a partir daí. O código de teste já vem separado do código principal, e o junit já vem como dependência da aplicação. Você também pode criar as pastas <code>src/main/resources</code> e <code>src/test/resources</code> para colocar os recursos (arquivos de configuração, de teste, e etc) do código principal e do de testes, respectivamente. Tudo que estiver dentro dessas pastas é copiado diretamente para o diretório onde as classes são compiladas, sem que seja necessário fazer nenhuma configuração adicional.</p>
<p>Se você, por algum motivo, não gostou da estrutura que o Maven criou, ou está querendo migrar um projeto para o Maven que não segue essa estrutura, você pode configurar os diretórios do projeto<br />
<a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Super_POM">acrescentando algumas linhas no pom</a>:</p>
<pre><code>&lt;project&gt;
...
&lt;build&gt;
    &lt;sourceDirectory&gt;
      ${project.basedir}/src/java/main
    &lt;/sourceDirectory&gt;
    &lt;testSourceDirectory&gt;
      ${project.basedir}/src/java/test
    &lt;/testSourceDirectory&gt;
    &lt;resources&gt;
          &lt;resource&gt;
                 &lt;directory&gt;
                   ${project.basedir}/src/resources/main
                 &lt;/directory&gt;
          &lt;/resource&gt;
    &lt;/resources&gt;
    &lt;testResources&gt;
          &lt;testResource&gt;
                 &lt;directory&gt;
                   ${project.basedir}/src/resources/test
                 &lt;/directory&gt;
          &lt;/testResource&gt;
    &lt;/testResources&gt;
&lt;/build&gt;

...
&lt;/project&gt;
</code></pre>
<p>Nesse exemplo o diretório principal de código e de recursos estarão em <code>src/java/main</code> e  <code>src/resources/main</code> respectivamente, e os diretorios de teste em <code>src/java/test</code> e <code>src/resources/test</code>.</p>
<p>Agora com um projeto Maven já preparado, vamos para a principal funcionalidade: o build. O build do Maven é baseado no conceito de <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">ciclo de vida</a>: o processo de construção e distribuição da sua aplicação é dividido em partes bem definidas chamadas fases, seguindo um ciclo. O ciclo padrão é o seguinte:</p>
<ul>
<li><strong>compile</strong> &#8211; compila o código fonte do projeto</li>
<li><strong>test</strong> &#8211; executa os testes unitários do código compilado, usando uma ferramenta de testes unitários, como o junit.</li>
<li><strong>package</strong> &#8211; empacota o código compilado de acordo com o empacotamento escolhido, por exemplo, em JAR.</li>
<li><strong>integration-test</strong> &#8211; processa e faz o deploy do pacote em um ambiente onde os testes de integração podem ser rodados.</li>
<li><strong>install</strong> &#8211; instala o pacote no repositório local, para ser usado como dependência de outros projetos locais</li>
<li><strong>deploy</strong> &#8211; feito em ambiente de integração ou de release, copia o pacote final para um repositório remoto para ser compartilhado entre desenvolvedores e projetos</li>
</ul>
<p>Você pode invocar qualquer dessas fases na linha de comando, digitando:</p>
<p><code>mvn [fase]</code></p>
<p>Por exemplo se você digitar <code>mvn package</code> o Maven vai executar todas as fases anteriores do ciclo até a fase <code>package</code>. Uma lista completa das fases do ciclo de vida possíveis pode ser encontrada <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference">aqui</a>.</p>
<p>Algumas das fases do ciclo possuem plugins associadas a elas, e esses plugins são executados assim que a fase é chamada para ser executada. Você pode também registrar plugins para rodarem em qualquer fase do ciclo, conseguindo, assim, personalizar o build do seu projeto facilmente. Por exemplo, se você quiser criar um jar com o código fonte do projeto, e que esse jar seja gerado depois que o projeto foi empacotado, é só acrescentar no seu pom:</p>
<pre><code>&lt;project&gt;
  ...
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
        &lt;artifactId&gt;maven-source-plugin&lt;/artifactId&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;id&gt;attach-sources&lt;/id&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
              &lt;goal&gt;jar&lt;/goal&gt;
            &lt;/goals&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
  ...
&lt;/project&gt;
</code></pre>
<p>Assim, o plugin <a href="http://maven.apache.org/plugins/maven-source-plugin/">Source</a> vai executar seu goal <code>jar</code> na fase <code>package</code> do ciclo de vida. É como se fosse chamado <code>mvn source:jar</code> quando o build passa pela fase de package. A fase package já possui um plugin associado a ela: o <code>jar:jar</code> (supondo que é um projeto jar), então o plugin source só será executado depois do jar:jar. Em geral se você registrar mais de um plugin pra mesma fase, eles serão executados na ordem em que eles forem declarados. O jeito de configurar o plugin para colocá-lo dentro de uma fase do ciclo geralmente está no site principal do plugin, na seção <strong>Usage</strong>.</p>
<p>O Maven possui ainda outras funcionalidades interessantes, como geração de relatórios. Alguns plugins também merecem uma atenção especial, como o <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/">Eclipse</a> que gera informações de projeto para o eclipse (<code>.classpath</code> e <code>.project</code>), o <a href="http://maven.apache.org/plugins/maven-antrun-plugin/">Antrun</a> que te permite executar código Ant dentro do Maven, o <a href="http://maven-plugins.sourceforge.net/maven-cobertura-plugin/">Cobertura</a> que gera um relatório mostrando a cobertura de testes no seu projeto, o <a href="http://mojo.codehaus.org/jetty-maven-plugin/usage.html">Jetty</a> que sobe uma instância do Jetty com sua aplicação deployed, o <a href="http://mojo.codehaus.org/selenium-maven-plugin/">Selenium</a> que sobe uma instância do servidor do Selenium para poder fazer os testes de aceitação do selenium, enfim, existem vários plugins interessantes e é relativamente fácil achar o plugin que faz o que você precisa. É igualmente fácil, também, fazer um plugin para o Maven, o chamado <a href="http://maven.apache.org/plugin-developers/index.html">Mojo</a>.</p>
<p>Aqui na Caelum, além do Maven e JUnit, usamos muito o <a href="http://selenium.openqa.org/">Selenium</a>, juntamente com o SeleniumDSL, para os testes de integração, e o <a href="http://cruisecontrol.sourceforge.net/">Cruise Control</a> para o controle da integração contínua. Esperamos colocar tutoriais e vídeos sobre essas ferramentas também.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/processo-de-build-com-o-maven/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>

