Gerenciamento de dependência sem maven usando ivy
Eu realmente não gosto de usar maven. Não porque o maven é ruim (embora seja intrusivo e as vezes MUITO lento), mas simplesmente porque usando ant as coisas ficam mais simples e mais fáceis. Sempre que começa uma discussão “maven x ant” o pessoal do maven sempre vem com a desculpa do gerenciamento de dependências. Pois bem, isso NÃO é motivo! Usando Ivy é possível gerenciar as dependências com ant e é isso que vou mostrar como fazer…
Esse é um exemplo bem simples que até lembra o quick start do ivy.
Antes de começar o código gostaria de agradecer e dar os créditos ao meu amigo Rodrigo Kamada que é responsável por boa parte desse exemplo.
- A primeira coisa é definir quais são as nossas dependências. No nosso caso estou com um exemplo de apache-commons que usa o commons-lang e o commons-cli.
package br.com.paniz; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.GnuParser; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.lang.WordUtils; public final class Exemplo { public static void main(String[] args) throws Exception { Option msg = OptionBuilder.withArgName("msg").hasArg().withDescription( "the message to capitalize").create("message"); Options options = new Options(); options.addOption(msg); CommandLineParser parser = new GnuParser(); CommandLine line = parser.parse(options, args); String message = line.getOptionValue("message", "Exemplo Ivy!"); System.out.println("standard message : " + message); System.out.println("capitalized by " + WordUtils.class.getName() + " : " + WordUtils.capitalizeFully(message)); } } - Nesse instante nosso código não compila porque não temos os jars necessários, então é hora de configurar o ivy.xml. O ivy.xml é um arquivo xml muito simples onde você descreve todas as dependências do projeto.
<ivy-module version="2.0"> <info organisation="br.com.paniz" module="exemplo-ivy" /> <dependencies> <dependency org="commons-lang" name="commons-lang" rev="2.4" ></dependency> <dependency org="commons-cli" name="commons-cli" rev="1.1" ></dependency> </dependencies> </ivy-module>
- Agora precisamos editar nosso build.xml
<project name="exemplo-ivy" default="run" xmlns:ivy="antlib:org.apache.ivy.ant"> <!-- Algumas variaveis utilizadas --> <property name="lib.dir" value="lib" /> <property name="build.dir" value="build" /> <property name="src.dir" value="src" /> <!-- Diretorio utilizado para a compilacao e execucao --> <path id="lib.path.id"> <fileset dir="${lib.dir}" /> </path> <path id="run.path.id"> <path refid="lib.path.id" /> <path location="${build.dir}" /> </path> <!-- ================================= Tarefa: Resolver ================================= --> <target name="resolve" description="--> Recuperar as dependencias com o Ivy"> <ivy:retrieve/> </target> <!-- ================================= Tarefa: Relatorio ================================= --> <target name="report" depends="resolve" description="--> Gerar um relatorio de dependencias"> <ivy:report todir="${build.dir}"/> </target> <!-- ================================= Tarefa: Executar ================================= --> <target name="run" depends="resolve" description="--> Compilar e executar o projeto"> <mkdir dir="${build.dir}" /> <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="lib.path.id" /> <property name="msg" value="Exemplo Ivy!"/> <java classpathref="run.path.id" classname="br.com.paniz.Exemplo"> <arg value="-message"/> <arg value="${msg}"/> </java> </target> <!-- ================================= Tarefa: Limpar ================================= --> <target name="clean" description="--> Limpar o projeto"> <delete includeemptydirs="true"> <fileset dir="${basedir}"> <exclude name="src/**" /> <exclude name="build.xml" /> <exclude name="ivy.xml" /> </fileset> </delete> </target> <!-- ================================= Tarefa: Limpar o cache ================================= --> <target name="clean-cache" description="--> Limpar o cache do Ivy"> <ivy:cleancache /> </target> </project>Como vocês podem notar, a única diferença desse build.xml para um comum é o ” xmlns:ivy=”antlib:org.apache.ivy.ant”>” e as tasks do ivy obviamente.
- Agora é só executar, mas para isso é necessário “instalar” o ivy. Para fazer isso, basta baixar a versão mais recente dele em http://ant.apache.org/ivy/download.html, descompactar e colocar o jar no seu ant home. (Se seu ant não estiver configurado recomendo que execute pelo eclipe ou siga o tutorial de instalação do ant)
- Se tudo foi executado com sucesso você terá uma saída parecida com a abaixo onde ele mostra que baixou os jars necessário, compilou e executou o código.
[ivy:retrieve] :: Ivy 2.0.0-rc2 – 20081028224207 :: http://ant.apache.org/ivy/ ::
:: loading settings :: url = jar:file:/Users/davidpaniz/.ant/lib/ivy-2.0.0-rc2.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: br.com.paniz#exemplo-ivy;working@Panizs-MacBook.paniz.com.br
[ivy:retrieve] confs: [default]
[ivy:retrieve] found commons-lang#commons-lang;2.4 in public
[ivy:retrieve] found commons-cli#commons-cli;1.1 in public
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.4/commons-lang-2.4.jar …
[ivy:retrieve] ………. (255kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] commons-lang#commons-lang;2.4!commons-lang.jar (3395ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.4/commons-lang-2.4-javadoc.jar …
[ivy:retrieve] ………………………………………………………………………………………. (695kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] commons-lang#commons-lang;2.4!commons-lang.jar(javadoc) (697ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.4/commons-lang-2.4-sources.jar …
[ivy:retrieve] ………………………………. (331kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] commons-lang#commons-lang;2.4!commons-lang.jar(source) (665ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-cli/commons-cli/1.1/commons-cli-1.1.jar …
[ivy:retrieve] …………………. (35kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] commons-cli#commons-cli;1.1!commons-cli.jar (417ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-cli/commons-cli/1.1/commons-cli-1.1-javadoc.jar …
[ivy:retrieve] ………………………………….
[ivy:retrieve] …………………………………
[ivy:retrieve] ………… (129kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] commons-cli#commons-cli;1.1!commons-cli.jar(javadoc) (4330ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-cli/commons-cli/1.1/commons-cli-1.1-sources.jar …
[ivy:retrieve] ………………………….. (45kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] commons-cli#commons-cli;1.1!commons-cli.jar(source) (899ms)
[ivy:retrieve] :: resolution report :: resolve 15828ms :: artifacts dl 10423ms
———————————————————————
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
———————————————————————
| default | 2 | 2 | 2 | 0 || 6 | 6 |
———————————————————————
[ivy:retrieve] :: retrieving :: br.com.paniz#exemplo-ivy
[ivy:retrieve] confs: [default]
[ivy:retrieve] 6 artifacts copied, 0 already retrieved (1493kB/19ms)
run:
[mkdir] Created dir: /Users/davidpaniz/workspace/ExemploIvy1/build
[javac] Compiling 1 source file to /Users/davidpaniz/workspace/ExemploIvy1/build
standard message : Exemplo Ivy!
capitalized by org.apache.commons.lang.WordUtils : Exemplo Ivy!
BUILD SUCCESSFUL
Total time: 27 seconds
Esse post foi bem introdutório e o real objetivo é apenas mostrar mais uma ótima ferramenta que existe no mercado. Se você se interessou pelo assunto e deseja saber mais mande um comentário ou email!