{"id":311,"date":"2013-01-03T14:36:31","date_gmt":"2013-01-03T17:36:31","guid":{"rendered":"https:\/\/www.erudio.com.br\/blog\/?p=311"},"modified":"2013-01-03T14:36:31","modified_gmt":"2013-01-03T17:36:31","slug":"entendendo-o-pom-do-maven","status":"publish","type":"post","link":"https:\/\/www.erudio.com.br\/blog\/entendendo-o-pom-do-maven\/","title":{"rendered":"Entendendo o POM do Maven"},"content":{"rendered":"<p>Continuando a responder a pergunta &#8220;para que serve o apache maven?&#8221; nesse post eu explico a estrutura b\u00e1sica de um arquivo POM. O POM \u00e9 um dos arquivos mais importantes em um projeto Maven, ele descreve uma s\u00e9rie de configura\u00e7\u00f5es que o projeto ter\u00e1 e quais reposit\u00f3rios e depend\u00eancias seu projeto ir\u00e1 precisar.<br \/>\nNo cabe\u00e7alho de um POM temos algumas tags b\u00e1sicas que definem qual vers\u00e3o 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 \u00e9 o nome o artefato final .war ou .jar ter\u00e1 quando empacotado. Version define a vers\u00e3o do projeto que ir\u00e1 complementar o nome do artefato. A tag Packaging por sua vez define qual tipo de empacotamento o projeto ter\u00e1 ap\u00f3s o processo de build, no nosso caso ser\u00e1 um .war. E a tag Name define o nome do projeto.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n    &lt;groupId&gt;br.com.semeru&lt;\/groupId&gt;\n    &lt;artifactId&gt;semeru_jsf_maven&lt;\/artifactId&gt;\n    &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;packaging&gt;war&lt;\/packaging&gt;\n    &lt;name&gt;semeru_jsf_maven&lt;\/name&gt;\n<\/pre>\n<p>A tag Properties possibilita definir por exemplo a vers\u00e3o do Spring, ou do JSF adotada para o projeto. Se uma depend\u00eancia for definida como no trecho de c\u00f3digo abaixo ao mudarmos a vers\u00e3o do Spring, por exemplo, para 3.1 todas as depend\u00eancias ser\u00e3o baixadas para a vers\u00e3o 3.1. Podemos definir o cont\u00eainer web no qual ser\u00e1 feito o deploy da aplica\u00e7\u00e3o (Tomcat) e tamb\u00e9m o tipo de codifica\u00e7\u00e3o utilizada pelo projeto, no nosso caso o UTF8 .<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n    &lt;properties&gt;\n        &lt;spring.version&gt;3.0.5.RELEASE&lt;\/spring.version&gt;\n        &lt;themes.version&gt;1.0.8&lt;\/themes.version&gt;\n        &lt;jsf.version&gt;2.1.7&lt;\/jsf.version&gt;\n        &lt;jstl.version&gt;1.2&lt;\/jstl.version&gt;\n        &lt;netbeans.hint.deploy.server&gt;Tomcat&lt;\/netbeans.hint.deploy.server&gt;   \n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n    &lt;\/properties&gt;\n<\/pre>\n<p>A tag Repositories define a lista de reposit\u00f3rios que ser\u00e3o acessados pelo Maven para baixar nossas dependencias. Muitas vezes \u00e9 necess\u00e1rio colocar um reposit\u00f3rio priorit\u00e1rio no inicio do POM para que o Maven inicie a busca pelas depend\u00eancias a partir dele.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n    &lt;repositories&gt;\n        \n        &lt;!-- PRIMEFACES REPOSITORY --&gt;\n        &lt;repository&gt;\n            &lt;id&gt;prime-repo&lt;\/id&gt;\n            &lt;name&gt;PrimeFaces Maven Repository&lt;\/name&gt;\n            &lt;url&gt;http:\/\/repository.primefaces.org&lt;\/url&gt;\n            &lt;layout&gt;default&lt;\/layout&gt;\n        &lt;\/repository&gt;        \n                \n        &lt;!-- FACELETS TAGLIBRARIES REPOSITORY --&gt;\n        \n        &lt;repository&gt;\n            &lt;id&gt;org.springframework.security.taglibs.facelets&lt;\/id&gt;\n            &lt;url&gt;http:\/\/spring-security-facelets-taglib.googlecode.com\/svn\/repo\/&lt;\/url&gt;\n        &lt;\/repository&gt;\n\n    &lt;\/repositories&gt;\n<\/pre>\n<p>A tag dependencies define quais ser\u00e3o as depend\u00eancias utilizadas no projeto no trecho de c\u00f3digo abaixo declaramos algumas das depend\u00eancias necess\u00e1rias para se trabalhar com JavaServer Faces.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n    &lt;dependencies&gt;\n\n        &lt;!-- || DEPEND\u00caNCIAS DO JAVA SERVER FACES || --&gt;                        \n        &lt;!-- ############## JSF-API ################ --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.sun.faces&lt;\/groupId&gt;\n            &lt;artifactId&gt;jsf-api&lt;\/artifactId&gt;\n            &lt;version&gt;${jsf.version}&lt;\/version&gt;\n            &lt;scope&gt;compile&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n\n        &lt;!-- ############## JSF-IMPL ############### --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.sun.faces&lt;\/groupId&gt;\n            &lt;artifactId&gt;jsf-impl&lt;\/artifactId&gt;\n            &lt;version&gt;${jsf.version}&lt;\/version&gt;\n        &lt;\/dependency&gt;\n                \n        &lt;!-- ################ JSTL ################# --&gt;\n        &lt;dependency&gt;  \n            &lt;groupId&gt;javax.servlet&lt;\/groupId&gt;  \n            &lt;artifactId&gt;jstl&lt;\/artifactId&gt;  \n            &lt;version&gt;${jstl.version}&lt;\/version&gt;  \n        &lt;\/dependency&gt;  \n    &lt;\/dependencies&gt;\n<\/pre>\n<p>Muitas vezes algumas depend\u00eancias precisam ser exclu\u00eddas. Isso acontece por v\u00e1rios motivos primeiro pode ser que o projeto j\u00e1 utilize uma vers\u00e3o diferente da mesma depend\u00eancia. Um segundo motivo pode ser o fato da depend\u00eancia em quest\u00e3o gerar conflitos com outras utilizadas no projeto. A sintaxe para remover uma depend\u00eancia \u00e9 como o trecho de c\u00f3digo abaixo. Nele estamos declarando a depend\u00eancia do DOM4J mas estamos dizendo ao Maven para n\u00e3o baixar a depend\u00eancia da XML-APIS. Se tirarmos essa exclus\u00e3o o Maven vai analizar o POM da DOM4J e verificar\u00e1 que ela possui uma depend\u00eancia da XML-APIS e assim entender\u00e1 que o projeto necessita dela e ir\u00e1 baix\u00e1-la para nosso .m2.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n        &lt;!-- ############### DOM4J ################# --&gt;\n        &lt;dependency&gt;\n            &lt;artifactId&gt;dom4j&lt;\/artifactId&gt;\n            &lt;groupId&gt;dom4j&lt;\/groupId&gt;\n            &lt;type&gt;jar&lt;\/type&gt;\n            &lt;version&gt;1.6.1&lt;\/version&gt;\n            &lt;exclusions&gt;\n                &lt;exclusion&gt;\n                    &lt;artifactId&gt;xml-apis&lt;\/artifactId&gt;\n                    &lt;groupId&gt;xml-apis&lt;\/groupId&gt;\n                &lt;\/exclusion&gt;\n            &lt;\/exclusions&gt;\n        &lt;\/dependency&gt;\n<\/pre>\n<p>Anteriormente no post <a href=\"https:\/\/www.erudio.com.br\/blog\/?p=287\" title=\"Entendendo o Apache Maven\">Entendendo o Apache Maven<\/a> eu expliquei outros detalhes importantes do Maven al\u00e9m disso no GUJ tem um <a href=\"http:\/\/www.guj.com.br\/content\/articles\/maven\/maven_2_guj.pdf\" title=\"Tutorial Maven GUJ\">tutorial bem legal sobre o assunto.<\/a><\/p>\n<h2>Treinamentos relacionados com este post<\/h2>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_java\" target=\"_blank\" rel=\"noopener\"><br \/>\n<img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0  AWS com Spring Boot 3, Java e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/07-rest-spring-java.png\" \/><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_microservices_java\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microservices do 0 com Spring Cloud, Spring Boot e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/14-microservices-java.png\" \/><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_kotlin\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0 AWS com Spring Boot 3, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/18-rest-spring-kotlin.png\" \/><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_ms_kotlin\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microsservi\u00e7os do 0 com Spring Cloud, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/22-ms-kotlin.png\" \/><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker do 0 \u00e0 Maestria: Cont\u00eaineres Desmistificados mais 3 B\u00d4NUS\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/09-docker.png\" \/><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker_para_aws\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker para Amazon AWS Implante Apps Java e .NET com Travis CI\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/10-docker-to-aws.png\" \/><br \/>\n<\/a><\/p>\n<p><a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_kotlin\" target=\"_blank\" rel=\"noopener\"> <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Kotlin para DEVs Java: Aprenda a Linguagem Padr\u00e3o do Android\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/20-kotlin.png\" \/><br \/>\n<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Continuando a responder a pergunta &#8220;para que serve o apache maven?&#8221; nesse post eu explico a estrutura b\u00e1sica de um arquivo POM. O POM \u00e9 um dos arquivos mais importantes em um projeto Maven, ele descreve uma s\u00e9rie de configura\u00e7\u00f5es que o projeto ter\u00e1 e quais reposit\u00f3rios e depend\u00eancias seu projeto ir\u00e1 precisar. No cabe\u00e7alho [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2,10],"tags":[],"_links":{"self":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/311"}],"collection":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/comments?post=311"}],"version-history":[{"count":0,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/311\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media?parent=311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/categories?post=311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/tags?post=311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}