{"id":404,"date":"2009-06-14T15:00:33","date_gmt":"2009-06-14T18:00:33","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=404"},"modified":"2009-06-14T17:46:16","modified_gmt":"2009-06-14T20:46:16","slug":"apache-ant-como-pude-te-ignorar-por-tanto-tempo","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=404","title":{"rendered":"Apache Ant: como pude te ignorar por tanto tempo???"},"content":{"rendered":"<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-405\" title=\"ant_logo_large\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif\" alt=\"\" width=\"190\" height=\"120\" \/><\/a>&#8220;Comodismo emburrece&#8221;. Sempre repito orgulhosamente esta frase. Nesta semana acabei por perceber que tamb\u00e9m cai v\u00edtima do mesmo. Devido \u00e0 comodidade que o Netbeans nos oferece no deploy e build de aplica\u00e7\u00f5es, acabei por ignorar completamente o motor respons\u00e1vel por esta comodidade: o <a href=\"http:\/\/ant.apache.org\" target=\"_blank\">Apache Ant<\/a>.<\/p>\n<p>Na realidade, n\u00e3o foi s\u00f3 o comodismo que me privou de aprender a ferramenta: confesso que a <strong>pregui\u00e7a <\/strong>foi o fator fundamental. Toda vez que lia os scripts do Ant (escritos em XML), me lembrava dos meus tempos do <a href=\"http:\/\/www.gnu.org\/software\/make\/\" target=\"_blank\">make<\/a>. Al\u00e9m disto, sempre via os scripts do Ant com certo desd\u00e9m (n\u00e3o sou f\u00e3 de DSLs baseadas em XML). Mas recentemente topei com um problema: como automatizar o deploy de minhas aplica\u00e7\u00f5es utilizando Java Webstart?<\/p>\n<p>Como utilizo o Spring + Hibernate, a quantidade de arquivos no formato JAR que preciso distribuir \u00e9 significativa. O que implica na necessidade de executar sempre executar as mesmas tarefas:<\/p>\n<ul>\n<li>Assinar todos os meus arquivos .jar<\/li>\n<li>Criar um arquivo .jnlp<\/li>\n<li>Enviar tanto o arquivo .jnlp quanto os arquivos jar assinados para o servidor<\/li>\n<\/ul>\n<p>O Netbeans est\u00e1 atualmente caminhando para tornar esta tarefa corriqueira, por\u00e9m enquanto isto ainda n\u00e3o se tornou realidade, eu precisava repetir esta tarefa <strong>manualmente (SHAME ON ME!)<\/strong>. Posteriormente escrevi um script em Groovy, por\u00e9m acabei decidindo por me arriscar com o Ant. E o resultado foi maravilhoso!<\/p>\n<p>A op\u00e7\u00e3o pelo Ant se deu quando encontrei por acaso na Internet uma biblioteca de tags chamada <a href=\"http:\/\/ovanttasks.sourceforge.net\/rat\/chapter-N104F5.html\" target=\"_blank\">Orange Volt<\/a> cujo objetivo era justamente a automatiza\u00e7\u00e3o do processo que listei acima. Basicamente, a utilizo para gerar o arquivo jnlp, por\u00e9m todo o procedimento anterior \u00e9 executado usando as tags nativas do pr\u00f3prio Ant.<\/p>\n<p>Bem, visto que j\u00e1 babei o ovo do Ant, conv\u00e9m descrever a criatura. Trata-se de uma ferramenta de build similar ao GNU Make, por\u00e9m sem os problemas decorrentes desta. Para come\u00e7ar, n\u00e3o \u00e9 baseada na execu\u00e7\u00e3o de aplica\u00e7\u00f5es instaladas no computador do usu\u00e1rio, mas sim em classes Java, o que torna seus scripts muito mais f\u00e1cilmente port\u00e1veis. Al\u00e9m disto, o fato de usar o XML acabou se mostrando uma alternativa bastante interessante tamb\u00e9m (e ai eu paguei lingua) em compara\u00e7\u00e3o com a sintaxe do Make (qualquer um que j\u00e1 enfrentou problemas com o caractere tab no make sabe do que estou falando).<\/p>\n<h2><strong>Instala\u00e7\u00e3o<\/strong><\/h2>\n<p>A instala\u00e7\u00e3o do Ant \u00e9 muito simples, e \u00e9 composta pelos seguintes passos:<\/p>\n<ol>\n<li>Baixar o Ant em seu site oficial: <a href=\"http:\/\/ant.apache.org\" target=\"_blank\">http:\/\/ant.apache.org<\/a><\/li>\n<li>Descompactar o conte\u00fado do arquivo zipado em um diret\u00f3rio de sua escolha<\/li>\n<li>Cria\u00e7\u00e3o de uma vari\u00e1vel de ambiente chamada ANT_HOME, cujo valor deve consisistir no diret\u00f3rio no qual o arquivo zipado foi descompactado.<br \/>\nSendo assim, se voc\u00ea descompactou o arquivo no diret\u00f3rio C:\\Ant, esta vari\u00e1vel dever\u00e1 possuir o valor C:\\Ant<\/li>\n<li>Incluir no path do seu sistema o diret\u00f3rio ANT_HOME\/bin<\/li>\n<li>Verificar se a vari\u00e1vel de ambiente JAVA_HOME est\u00e1 definida no seu sistema.<\/li>\n<\/ol>\n<p>Executados estes passos, no seu shell digite o comando ant. Se obtiver uma resposta similar a<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\nBuildfile: build.xml does not exist!\r\nBuild failed\r\n\r\n<\/pre>\n<p>\u00e9 sinal de que o ant foi instalado com sucesso.<\/p>\n<h2>Usando o Ant<\/h2>\n<p>Como mencionei acima, um script de build do Ant consiste em um documento no formato XML tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;pre&gt;&lt;project name=&quot;meuProjeto&quot; default=&quot;dist&quot; basedir=&quot;.&quot;&gt;\r\n&lt;description&gt;\r\nUm script ant que n\u00e3o serve para nada!\r\n&lt;\/description&gt;\r\n...\r\n&lt;target name=&quot;dist&quot;&gt;\r\n&lt;!-- Eu irei fazer alguma coisa --&gt;\r\n&lt;\/target&gt;\r\n&lt;\/project&gt;&lt;\/pre&gt;\r\n<\/pre>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/o1_xml.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-406 alignright\" title=\"o1_xml\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/o1_xml.jpg\" alt=\"\" width=\"166\" height=\"192\" \/><\/a><\/p>\n<p>Este documento no formato xml deve se chamar build.xml. Quando o comando ant \u00e9 executado, \u00e9 buscado no diret\u00f3rio corrente a exist\u00eancia deste arquivo (trata-se do comportamento default da ferramenta). Como pode ser visto no exemplo acima, o elemento raiz deste documento se chama project.<\/p>\n<p>Os principais atributos a serem definidos nesta tag s\u00e3o:<br \/>\n<strong>name<\/strong>: o nome do projeto<br \/>\n<strong>default<\/strong>: o alvo (target) a ser executado por default pelo script caso nenhum seja definido na linha de comando (mais sobre isto adiante)<br \/>\n<strong>basedir<\/strong>: o diret\u00f3rio base para a execu\u00e7\u00e3o do script. No exemplo acima, se trata do diret\u00f3rio corrente.<\/p>\n<p>A tag <strong>description<\/strong> \u00e9 opcional. Serve apenas para fins de documenta\u00e7\u00e3o.<\/p>\n<p>Em um projeto podem ser definidos mais de um alvo (target). Um target consiste em um conjunto de tarefas a serem executadas pelo script. Tal como no make, voc\u00ea tamb\u00e9m pode definir interdepend\u00eancias entre as mesmas, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n\r\n&lt;project name=&quot;projeto&quot; default=&quot;distribuir&quot; basedir=&quot;.&quot;&gt;\r\n\r\n&lt;target name=&quot;copiar&quot;&gt;\r\n...\r\n&lt;\/target&gt;\r\n\r\n&lt;target name=&quot;compilar&quot;&gt;\r\n...\r\n&lt;\/target&gt;\r\n\r\n&lt;target name=&quot;distribuir&quot; depends=&quot;compilar, copiar&quot;&gt;\r\n...\r\n&lt;\/target&gt;\r\n\r\n&lt;\/project&gt;\r\n\r\n<\/pre>\n<p>No exemplo acima, o target distribuir que \u00e9 o default ao ser executado ir\u00e1 antes chamar os alvos compilar e copiar. Conv\u00e9m mencionar no entanto que a ordem de execu\u00e7\u00e3o n\u00e3o necess\u00e1riamente ser\u00e1 compilar e copiar. Se houver mais depend\u00eancias nas tags compilar ou copiar, estas ser\u00e3o executadas antes das mesmas.<\/p>\n<p>\u00c9 poss\u00edvel tamb\u00e9m pela linha de comando executar um target espec\u00edfico. Se for executado o comando <em>ant compilar<\/em>, por exemplo, a tag distribuir (definida como default no exemplo) n\u00e3o ser\u00e1 executada.<\/p>\n<h2>Tasks<\/h2>\n<p>Assim como um projeto \u00e9 composto por alvos, um alvo \u00e9 composto por tarefas (tasks). Uma task nada mais \u00e9 do que um peda\u00e7o de c\u00f3digo que pode ser executado. Simplificando ainda mais esta descri\u00e7\u00e3o, pense em uma task como um comando. A sintaxe de defini\u00e7\u00e3o de uma task dentro de um target \u00e9 muito simples:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n\r\n&lt;nome_da_task atributo1=&quot;valor1&quot; atributo2=&quot;valor2&quot; ... atributoN=&quot;valorN&quot;\/&gt;\r\n\r\n<\/pre>\n<p>O Ant j\u00e1 v\u00eam com uma s\u00e9rie de tasks pr\u00e9 definidas, cuja lista pode ser acessada neste <a href=\"http:\/\/ant.apache.org\/manual\/coretasklist.html\" target=\"_blank\">link<\/a>.<\/p>\n<p>Para melhor entender o funcionamento das tasks, segue abaixo um exemplo de build file bem simples. No caso, ele ir\u00e1 fazer o backup de um projeto qualquer.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n\r\n&lt;project name=&quot;backup&quot; default=&quot;backup&quot; basedir=&quot;.&quot;&gt;\r\n\r\n&lt;property name=&quot;diretorioDestino&quot; location=&quot;..\/backup&quot;\/&gt;\r\n\r\n&lt;target name=&quot;backup&quot;&gt;\r\n\r\n&lt;mkdir dir=&quot;${diretorioDestino}&quot;\/&gt;\r\n&lt;zip destFile=&quot;${diretorioDestino}\/backup.zip&quot;\r\nbasedir=&quot;.&quot;\/&gt;\r\n\r\n&lt;\/target&gt;\r\n\r\n&lt;\/project&gt;\r\n\r\n<\/pre>\n<p>Ao ser executado, o script ir\u00e1 executar o alvo default (que tamb\u00e9m \u00e9 o \u00fanico no caso): default. As tasks definidas em seu interior ser\u00e3o executadas na ordem em que s\u00e3o definidas.<\/p>\n<p>Sendo assim, primeiro ser\u00e1 criado um diret\u00f3rio um n\u00edvel abaixo do corrente chamado backup (conv\u00e9m mencionar que este diret\u00f3rio somente ser\u00e1 criado caso j\u00e1 n\u00e3o exista). Para tal, utilizamos uma <strong>propriedade<\/strong> do script de build.<\/p>\n<p>Pense em uma <a href=\"http:\/\/ant.apache.org\/manual\/using.html#properties\" target=\"_blank\">propriedade <\/a>como se fosse uma vari\u00e1vel utilizada pelo script. No caso, a propriedade em quest\u00e3o diz respeito a uma localiza\u00e7\u00e3o no disco r\u00edgido do usu\u00e1rio (o que explica o atributo location passado para a mesma).<\/p>\n<p>Utilizamos o valor da propriedade diretorioDestino na task <a href=\"http:\/\/ant.apache.org\/manual\/CoreTasks\/mkdir.html\" target=\"_blank\">mkdir <\/a>utilizando uma sintaxe bastante similar \u00e0 EL com a qual estamos acostumados a trabalhar em arquivos JSP. Basicamente \u00e9 a seguinte:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n\r\n&lt;task nome_do_atributo=&quot;${nome_da_propriedade}&quot;\/&gt;\r\n\r\n<\/pre>\n<p>Em seguida, \u00e9 executada a task <a href=\"http:\/\/ant.apache.org\/manual\/CoreTasks\/zip.html\" target=\"_blank\">zip<\/a>. A fun\u00e7\u00e3o desta tag consiste em criar um arquivo no formato zip. No caso, usei apenas dois dos seus atributos: destFile (que indica o nome do arquivo a ser criado) e basedir (que diz qual o diret\u00f3rio raiz que cont\u00e9m os arquivos a serem inclu\u00eddos no conte\u00fado compactado).<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Dica importante:<\/strong><\/span> sempre consulte o manual do Ant online. <a href=\"http:\/\/ant.apache.org\/manual\/index.html\" target=\"_blank\">http:\/\/ant.apache.org\/manual\/index.html<\/a><\/p>\n<h2>Criando e usando suas pr\u00f3prias tasks<\/h2>\n<p>\u00d3bviamente as tasks que acompanham o Ant n\u00e3o ir\u00e3o suprir 100% das suas necessidades. Neste caso, \u00e9 poss\u00edvel criar as suas pr\u00f3prias tasks. No manual do Ant h\u00e1 um guia muito simples de como faz\u00ea-lo: <a href=\"http:\/\/ant.apache.org\/manual\/developlist.html\" target=\"_blank\">http:\/\/ant.apache.org\/manual\/developlist.html<\/a><\/p>\n<p>Criadas as suas tasks, estas dever\u00e3o ser empacotadas em arquivos jar. Uma vez gerados os seus arquivos jar, basta copi\u00e1-los para o diret\u00f3rio ANT_HOME\/lib e em seguida utiliz\u00e1-las em seus projetos do Ant.<\/p>\n<p>Em seguida, para utiliz\u00e1-las em seus scripts, utilize a task\u00a0<code><em>taskdef<\/em>, tal como no exemplo abaixo:<\/code><\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n\r\n&lt;code&gt;&lt;project name=&quot;blabla&quot; basedir=&quot;.&quot; default=&quot;blablaTask&quot;&gt;\r\n&lt;taskdef name=&quot;mytask&quot; classname=&quot;caminho.para.sua.Task&quot; \/&gt;\r\n...&lt;\/code&gt;\r\n&lt;\/project&gt;\r\n\r\n<\/pre>\n<p>Esta task possui apenas dois atributos:<br \/>\n<strong>name<\/strong>: o nome que identificar\u00e1 a sua task dentro do seu script<br \/>\n<strong>classname<\/strong>: o caminho da classe que cont\u00e9m a sua implementa\u00e7\u00e3o<\/p>\n<p>Sendo assim, no mesmo exemplo acima a task poderia ser utilizada como<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n\r\n&lt;code&gt;&lt;project name=&quot;blabla&quot; basedir=&quot;.&quot; default=&quot;blablaTarget&quot;&gt;\r\n&lt;taskdef name=&quot;mytask&quot; classname=&quot;caminho.para.sua.Task&quot; \/&gt;\r\n\r\n&lt;target name=&quot;blablaTarget&quot;&gt;&lt;\/code&gt;\r\n\r\n&lt;mytask attribute1=&quot;algum valor&quot; attribute2=&quot;outro valor&quot;\/&gt;\r\n\r\n&lt;\/target&gt;\r\n\r\n&lt;\/project&gt;\r\n\r\n<\/pre>\n<p><strong><span style=\"color: #ff0000;\">Lembre-se: <\/span>tasks s\u00f3 podem existir dentro de targets!<\/strong><\/p>\n<h2>Tasks realmente \u00fateis<\/h2>\n<p>Dentre as tasks dispon\u00edveis pelo Ant, algumas se mostraram incr\u00edvelmente \u00fateis para mim:<\/p>\n<p><strong>signjar:<\/strong> \u00e9 a tag que utilizo para assinar todos os meus arquivos .jar (e que me ajudou a resolver o problema com o Java Webstart)<\/p>\n<p><strong>jar: <\/strong>gera arquivos .jar<\/p>\n<p><strong>war\/ear: <\/strong>Geram respectivamente arquivos .war e .ear (trata-se de uma especializa\u00e7\u00e3o da tag jar<\/p>\n<p><strong>tar: <\/strong>gera arquivos .tar<\/p>\n<p><strong>zip\/unzip:<\/strong> Compacta\/descompacta arquivos no formato .zip<\/p>\n<p><strong>patch<\/strong>: executa patchs em arquivos originais<\/p>\n<p><strong>sync:<\/strong> sincroniza arquivos presentes em diret\u00f3rios diferentes.<\/p>\n<h2>Conclus\u00f5es<\/h2>\n<ul>\n<li>Comodismo gera ignor\u00e2ncia :). Procure sempre que poss\u00edvel pensar FORA de sua IDE favorita.<\/li>\n<li>A sintaxe em XML do Ant, apesar de inicialmente gerar resist\u00eancia <strong>\u00e9 uma m\u00e3o na roda.<br \/>\n<\/strong>Mas se voc\u00ea n\u00e3o gostar da sintaxe XML do Ant, pode contar com o <a href=\"http:\/\/gant.codehaus.org\/\" target=\"_blank\">GANT <\/a>tamb\u00e9m (eu acho lindo como Groovy sempre torna as coisas mais bonitas)<\/li>\n<li>Ant \u00e9 MUITO mais simples do que aparenta em um primeiro momento.<\/li>\n<li>Muito cuidado para n\u00e3o ficar viciado no Ant (agora gero scripts do Ant pra basicamente TODAS as minhas tarefas de manuten\u00e7\u00e3o em meus computadores (e em alguns momentos apenas por divers\u00e3o))<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;Comodismo emburrece&#8221;. Sempre repito orgulhosamente esta frase. Nesta semana acabei por perceber que tamb\u00e9m cai v\u00edtima do mesmo. Devido \u00e0 comodidade que o Netbeans nos oferece no deploy e build de aplica\u00e7\u00f5es, acabei por ignorar completamente o motor respons\u00e1vel por esta comodidade: o Apache Ant. Na realidade, n\u00e3o foi s\u00f3 o comodismo que me privou [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[39,36,6,25],"tags":[],"class_list":["post-404","post","type-post","status-publish","format-standard","hentry","category-ant","category-desenvolvimento-de-software","category-java","category-software-livre"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Apache Ant: como pude te ignorar por tanto tempo??? - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=404\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apache Ant: como pude te ignorar por tanto tempo??? - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"&#8220;Comodismo emburrece&#8221;. Sempre repito orgulhosamente esta frase. Nesta semana acabei por perceber que tamb\u00e9m cai v\u00edtima do mesmo. Devido \u00e0 comodidade que o Netbeans nos oferece no deploy e build de aplica\u00e7\u00f5es, acabei por ignorar completamente o motor respons\u00e1vel por esta comodidade: o Apache Ant. Na realidade, n\u00e3o foi s\u00f3 o comodismo que me privou [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=404\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2009-06-14T18:00:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2009-06-14T20:46:16+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=404\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=404\",\"name\":\"Apache Ant: como pude te ignorar por tanto tempo??? - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=404#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=404#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif\",\"datePublished\":\"2009-06-14T18:00:33+00:00\",\"dateModified\":\"2009-06-14T20:46:16+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=404#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=404\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=404#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=404#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apache Ant: como pude te ignorar por tanto tempo???\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Apache Ant: como pude te ignorar por tanto tempo??? - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=404","og_locale":"pt_BR","og_type":"article","og_title":"Apache Ant: como pude te ignorar por tanto tempo??? - \/dev\/Kico","og_description":"&#8220;Comodismo emburrece&#8221;. Sempre repito orgulhosamente esta frase. Nesta semana acabei por perceber que tamb\u00e9m cai v\u00edtima do mesmo. Devido \u00e0 comodidade que o Netbeans nos oferece no deploy e build de aplica\u00e7\u00f5es, acabei por ignorar completamente o motor respons\u00e1vel por esta comodidade: o Apache Ant. Na realidade, n\u00e3o foi s\u00f3 o comodismo que me privou [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=404","og_site_name":"\/dev\/Kico","article_published_time":"2009-06-14T18:00:33+00:00","article_modified_time":"2009-06-14T20:46:16+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=404","url":"https:\/\/devkico.itexto.com.br\/?p=404","name":"Apache Ant: como pude te ignorar por tanto tempo??? - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=404#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=404#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif","datePublished":"2009-06-14T18:00:33+00:00","dateModified":"2009-06-14T20:46:16+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=404#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=404"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=404#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/06\/ant_logo_large.gif"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=404#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Apache Ant: como pude te ignorar por tanto tempo???"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/404"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=404"}],"version-history":[{"count":2,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/404\/revisions"}],"predecessor-version":[{"id":410,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/404\/revisions\/410"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}