↓ Arquivos ↓

Categorias → Open Source

Apache Ant: how could I ignore you for so long???

I’m so used to the way Netbeans treats the process of building and deploying my Java projects that I completely neglected one of the most powerful tools I had ever met: Apache Ant.

Actually, Netbeans wasn’t the only reason of my neglect. My own laziness have a big part on it. In the few times I had to read an Ant build script (always generated by Netbeans) I felt a certain angst of all that XML code. It always made me remember when I used to work with GNU make. Besides that, I’m not a big XML based DSL fan. Until I had to automate the process of deploying one of my applications using Java Webstart.

This application uses Spring + Hibernate. As a consequence, I have lots of jar files to deploy. The process consist in:

  • Sign all my jar files
  • Generate a JNLP file
  • Deploy all the files above to the server

Actually, Netbeans is progressing in this task , but it still isn’t right where I need. So, until then I had to manually (SHAME ON ME!!!) execute this task. My first attempt was to write a Groovy script. But just by accident I discovered a set of ant tasks named Orange Volt which led me to finally learn Apache Ant. And the result was just WONDERFUL!

After all this rant about Ant, I must at least describe this beast. It’s a build tool similar to GNU Make. Actually, I see it as a make refined at it’s best. All the annoyances of make are gone in ant: no more problems with characters like tab, and what is even more interesting: instead of being based on commands of the local machine, Ant is based on Java classes. As a consequence, Ant scripts are easier to transport among different computers. And the XML syntax for my surprise is actually quite useful in this case!

Installing Ant

Installing Ant is quite easy:

  1. Download the latest version at: http://ant.apache.org
  2. Unpack the downloaded file in any directory you want.
  3. Declare a system variable named ANT_HOME. This variable value must be the directory which you unpacked your Ant distribution.
  4. Add the ANT_HOME/bin directory to your system path
  5. Check if the JAVA_HOME variable is already declared on your system.

To test your installation, just type ant on your system shell. If everything is ok, the following prompt will appear:


Buildfile: build.xml does not exist!
Build failed

Using Ant

An Ant build script consist in an XML document similar to the following example:

<project name="myProject" default="dist" basedir=".">
<description>
An useless Ant script!
</description>
...
<target name="dist">
<!-- Maybe I'll do something -->
</target>
</project>

This file must be named build.xml. When you execute the ant command, Ant will seek for this file on your current directory (it’s the default behavior). As you can see on the above example: the root element of this document is called project.

The main attributes of this tag are:
name: the name of the project
default: the default target to be executed
basedir: the base directory of the script.

The description is optional. It’s used for documentation uses only.

An Ant project may have more than one target. A target is a set of tasks to be executed by the script. As in make, you may also define dependencies among targets as in the following example:


<project name="project" default="deploy" basedir=".">

<target name="copy">
...
</target>

<target name="compile">
...
</target>

<target name="deploy" depends="compile, copy">
...
</target>

</project>

In the above example, the deploy target is the default target executed by the script. But before it is executed, the compile and copy targets must be executed (they are the dependencies).

If you want, you can also execute a specific target by the command line. In this case, you only have to type the command ant [name of the target]

Tasks

As a project is composed of targets, a target is composed of tasks. You may see a task as a command to be executed. To add a task to a target, you will (as everything in Ant) use plain pure XML syntax like bellow:


<task_name attribute1="value1" attribute2="value2" ... attributeN="valueN"/>

Ant already comes with several core tasks ready to use, which list can be seen on this link.

To better understand how to use tasks, here is a quick example:


<project name="backup" default="backup" basedir=".">

<property name="destiny" location="../backup"/>

<target name="backup">

<mkdir dir="${destiny}"/>
<zip destFile="${destiny}/backup.zip"
basedir="."/>

</target>

</project>

This script will execute the backup target. It’s first action will be to execute the task mkdir. As it’s name already says, it will create a new directory (just in case it doesn’t exist) using the value defined on the property destiny.

A property is actually a global variable used by the Ant script. In this case, the destiny property is referring to a directory (that’s why I used the location attribute).

This property was used on the mkdir task using a syntax really close to the EL:


<task attribute_name="${property_name}"/>

After the execution of the mkdir task, the zip task is called. As it’s name already says, it will generate a zip file based on the two attributes I declared.

TIP: Ant have a GREAT online manual: http://ant.apache.org/manual/index.html

Writing your own tasks

Of course the Ant core tasks aren’t going to answer ALL your needs. In these cases, it’s possible to write your own. On the Ant manual there’s a great guide of how to do it: http://ant.apache.org/manual/developlist.html

With your own tasks ready, these must be packed on a jar file which then must be copied to the ANT_HOME/lib directory. (you may also add your jar files to your classpath if you want)

Here is an example of how to use external tag libraries in your own scripts:


<project name="blabla" basedir="." default="blablaTask">
<taskdef name="mytask" classname="packate.where.your.task.is.Task" />
...
</project>

To use an external task, you must declare the taskdef task in the project tag. It have two main attributes:
name: the name of your task (how you’ll declare it on your build script
classname: the complete class name

So, to see how your custom task could be used, let me complete the above example:


<project name="blabla" basedir="." default="blablaTarget">
<taskdef name="mytask" classname="caminho.para.sua.Task" />

<target name="blablaTarget">

<mytask attribute1="some value" attribute2="another value"/>

</target>

</project>

Remember: you may only declare tasks inside targets!

Usefull core tasks

In my short experience with Ant. Some of it’s core tasks where really usefull for me:

signjar: used to sign your jar files

jar: generate jar files

war/ear: it’s actually a specialization of the jar task. Used to generate .war and .ear files.

tar: used to create tar files.

zip/unzip: Compress/decompress files using the ZIP format.

patch: applies a diff file to originals

sync: synchronized a target directory with the files stored on another location.

Conclusions

  • Laziness generate ignorance :). It’s always a good thing to see things outside your favorite IDE.
  • Ant XML syntax is pretty handy. But if you don’t like it, you may also try GANT (it’s WONDERFUL for me how Groovy can always make things more elegant!)
  • Ant is easy!
  • Try not to get too much addicted to Ant (as I’m right now)

“Windows 2008 Server está fabuloso! Está igualzinho o Linux!” (ou por que software livre importa)

Recentemente ouvi a pérola que dá o título deste post de um colega que, após sair de uma demonstração de produtos Microsoft, ficou fascinado com a modularidade do novo sistema operacional, cuja interface gráfica agora pode ou não ser instalada. Por trás desta ingenuidade, no entanto, esconde-se uma realidade assustadora.

(é um bom exemplo de pateticidade, ou seja, a aparência comica que disfarça uma realidade infeliz)

Minha resposta foi óbvia: “hmm… entendi. Então você vai abandonar toda a liberdade que o software livre te dá em troca de algo que imita o que você já possui e ainda pagar para obter esta perda! Você é um ‘gênio’! ” A pessoa ficou meio atordoada com a resposta (provavelmente me considerou um xiita ou simplesmente um esnobe), o que é normal quando vemos o objeto de nossa ilusão desfazer-se diante de nossos olhos.

Mais uma vez, o problema do determinismo linguistico se aplica. Como a maior parte de nós em nossa formação basicamente só vimos produtos Microsoft, tudo aquilo que é diferente desta nos parece ameaçador. Como de uns anos pra cá a baixa qualidade dos produtos desta se mostrou evidente (o crescimento do Linux e da Apple expõe isto de forma gritante), muitos se sentem aliviados ao ver que os produtos da Microsoft estão “iguaizinhos os softwares livres”. 

O ponto óbvio é: tudo isto que hoje é visto como “fabuloso”, “inovador” e “criativo” já existe há décadas FORA da plataforma Microsoft. Não se trata de uma novidade em si, mas sim de uma novidade nos produtos Microsoft. Como a maior parte dos profissionais da área só conhecem produtos desta empresa, acaba-se por criar a ilusão de que, de fato, são novidades absolutas. 

(mais uma vez o mito da caverna se apresenta)

Observe que normalmente só vemos dois polos: Microsoft e Linux. Muitos vão para o Linux simplesmente por causa do custo. Linux é visto como algo cuja única vantagem consiste no preço. O fato de possuir uma qualidade superior nem é levado em consideração nestes casos. O importante é apenas reduzir o custo. E com isto se esquece o que de fato vêm a ser o software livre. 

Só pra lembrar, um software é considerado livre se fornece quatro liberdades ao usuário:

 

  • Liberdade de usar o software como, onde e quando quiser
  • Liberdade de acesso ao código fonte do software, assim como de alterá-lo.
  • Liberdade de distribuir o software
  • Liberdade de distribuir a sua versão modificada do software

 

Uma vez compreendidas estas liberdades (o que farei aqui), fica nítido que voltar a usar software proprietário é no mínimo retrocesso. 

Liberdade de uso do software: este é a liberdade mais óbvia. O usuário deve poder usar o software onde e como e quando quiser. Parece estranho pensar nisto em um primeiro momento. Afinal de contas, quando compro por exemplo uma licença do Office, eu o uso como, quando e onde quiser, certo? Errado. Leia sua licença. 

LIberdade de acesso ao código fonte, assim como de alterá-lo. A primeira vista, esta liberdade pode até parecer descartável. Afinal de contas, somente programadores irão compreender o que significa aquele “monte de texto maluco”, correto? Errado. Possuir acesso ao código fonte implica em saber o que de fato o software faz, como funciona e se está de fato trabalhando corretamente. Você pode até mesmo não entender nada de programação. Mas o fato de existirem pessoas que saibam, e que auditam este código continuamente fornece uma segurança muito maior ao usuário.

E por que alterá-lo? Simples: se o software faz quase o que você precisa, ele não faz o que você precisa. Neste caso, o que você faz? Espera indefinidamente por uma versão que faça o que você precisa? 

Liberdade de distribuir o software: os usuários de software proprietário podem até não perceber, mas encontram-se divididos. Divididos porque não podem compartilhar as ferramentas que utilizam. Se um usuário pode redistribuir o software que recebeu, ele e aqueles que o receberem na realidade se unem. Todos irão falar o mesmo idioma. 

Liberdade de distribuir versões modificadas do software: se sua modificação solucionou seu problema ou resolveu um defeito do software em questão, nada mais natural do que passá-la pra frente. É neste ponto que o software livre apresenta sua qualidade superior. 

Um software proprietário ao qual você possua acesso ao código fonte não lhe permite alterar seu código. E mesmo que permita, não lhe permite distribuir suas modificações. Afinal de contas, é proprietário. Se você soluciona um bug neste tipo de software, o máximo que poderá fazer consiste em enviar sua sugestão de reparo a seu fabricante e este, talvez, a incorpore em uma nova versão. No caso do software livre, o reparo é imediato. Encontrou um bug? Envie-o para a comunidade. Esta não aceitou sua solução? Sem problema: publique a sua versão modificada em seu site. 

Outra vantagem: se você possui a liberdade de distribuir versões modificadas do software, você é um fornecedor também. Consequentemente, a partir desta liberdade, torna-se impossível que o software em questão possua um único fornecedor. É o fim do vendor lock in!

Após entender o porquê das quatro liberdades, fica nítido que voltar ao modelo proprietário é retrocesso (retrocesso é minha maneira educada de dizer burrice). Infelizmente, a maior parte dos “profissionais” de nossa área que usam software livre sequer leram alguma vez a GPL ou qualquer licença. Software livre para estas pessoas equivale a software gratuito. E gratuito é diferente de livre. E por ignorância, veremos diversos casos de retrocesso rolando por ai.

Não se trata aqui de benevolência ou trabalho comunitário. Longe disto! Trata-se de um modelo justo visando o benefício do usuário (que é quem realmente interessa no final das contas) e, ao mesmo tempo, evita que o desenvolvimento da tecnologia seja definido por um número pequeno de fornecedores. Há um interesse economico FORTE por trás do software livre. Convenhamos: o modelo proprietário já expos que não aceita a proliferação de concorrentes (atualmente os fabricantes de software de peso consistem apenas em Microsoft, Apple, Adobe, Sun, Symantec e Oracle. Antes do predomínio da Microsoft, no entanto, haviam BEM mais). 

Aliás, a justificativa que ouvi da mesma pessoa foi: “mas a integração do Windows com os produtos Microsoft já vale a pena”. É… vale “muito” a pena cair DE NOVO no mesmo golpe do fornecedor único “geninho”…

 

 

PS: outro bom argumento que escuto: “produtos proprietários são mais fáceis de usar”. Cara, não são. Na realidade, são tão fáceis de usar quanto os livres. A diferença é que como você só OS conhece, eles na realidade estão ocultando sua incompetência lhe fornecendo a ilusão de poder.

Link: comparando licenças open source (com quadro comparativo realmente útil)

Encontrei este link na internet: Comparison of Different Open Source Licenses -“With Comparison Chart!”, no qual são comparadas diversas licenças open source, de uma maneira bem simples de entender.

Grande coisa: a diferença deste post é que contém um quadro comparativo bastante interessante, que exponho abaixo:

Get Adobe Flash playerPlugin by wpburn.com wordpress themes