Archive

Archive for the ‘ivy’ Category

Gerenciamento de dependência sem maven usando ivy

June 24th, 2009 9 comments

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!

Categories: ant, ivy Tags: , ,