Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

zecapistolas

Executar Ant via Java

Mensagens Recomendadas

zecapistolas

Viva,

Tenho um pequeno programa em Java que preciso que execute algumas acções via Ant.

Qual a melhor forma de integrar Ant em Java?!  🤔

[*]Crio o ficheiro .xml e invoco o ant como se fosse um programa externo?

[*]Dá para criar o input para o Ant e invocar o Ant com esse input tudo via Java?

cumps  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Não percebo o que queres dizer com a primeira questão, mas, relativamente à segunda, podes passar parâmetros para o ant com -D, por exemplo:

ant -Darg=1

Dentro do ant script tens que passar esse parametro para o executável.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
zecapistolas

Não percebo o que queres dizer com a primeira questão, mas, relativamente à segunda, podes passar parâmetros para o ant com -D, por exemplo:

ant -Darg=1

Dentro do ant script tens que passar esse parametro para o executável.

Não percebi a tua resposta....  :) Eu quero invocar o Ant em Java e não o contrário.

Encontrei isto, Invoking Apache Ant programmatically onde o Ant é invocado via Java, mas eu queria também que o .xml fosse criado dinamicamente.

cumps  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joseerodrigues

Não percebi a tua resposta....  :) Eu quero invocar o Ant em Java e não o contrário.

Encontrei isto, Invoking Apache Ant programmatically onde o Ant é invocado via Java, mas eu queria também que o .xml fosse criado dinamicamente.

cumps  ;)

No link que encontraste tens aí o exemplo para o que pretendes, tens apenas que gerar o xml primeiro e usar o codigo nesse exemplo depois.

Cumprimentos,

José Rodrigues

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
zecapistolas

No link que encontraste tens aí o exemplo para o que pretendes, tens apenas que gerar o xml primeiro e usar o codigo nesse exemplo depois.

Tens razão, comecei a fazer o exemplo e de facto funciona, mas agora preciso de algo mais complexo.  🤔

Por exemplo:

- Como adiciono mais property dinamicamente?

- Como posso passar por parâmetro o value ou location de uma property?

cumps  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joseerodrigues

Tens razão, comecei a fazer o exemplo e de facto funciona, mas agora preciso de algo mais complexo.  🤔

Por exemplo:

- Como adiciono mais property dinamicamente?

- Como posso passar por parâmetro o value ou location de uma property?

cumps  ;)

Deduzo que te refiras á property task certo?

Se sim, é simples, antes de adicionares um target ao projecto (project.addTarget), podes construir a property task e adicionar ao target.

Property prop = new Property();

prop.setLocation(fileLocation);
prop.setValue(strValue);

target.addTask(prop); // Property é uma subclass de Task

project.addTarget(target);

nota: não testei, apenas segui a documentação...

Cumprimentos,

José Rodrigues

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
zecapistolas

Ok, depois de muito  :wallbash: build.xml criado.  :cheesygrin:

Mas agora tenho um pequeno problema ao executar o ant com esse ficheiro:

build.xml:34: java.lang.ClassNotFoundException: org.apache.tools.ant.taskdefs.optional.junit.JUnitTaskMirrorImpl

at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.createMirror(JUnitTask.java:708)

at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.setupJUnitDelegate(JUnitTask.java:745)

at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:755)

at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)

at org.jacoco.ant.CoverageTask.execute(CoverageTask.java:95)

at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:616)

at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)

at org.apache.tools.ant.Task.perform(Task.java:348)

at org.apache.tools.ant.Target.execute(Target.java:390)

at org.apache.tools.ant.Target.performTasks(Target.java:411)

at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360)

at org.apache.tools.ant.Project.executeTarget(Project.java:1329)

Caused by: java.lang.ClassNotFoundException: org.apache.tools.ant.taskdefs.optional.junit.JUnitTaskMirrorImpl

at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1386)

at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1336)

at org.apache.tools.ant.util.SplitClassLoader.loadClass(SplitClassLoader.java:52)

at java.lang.ClassLoader.loadClass(ClassLoader.java:266)

at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.createMirror(JUnitTask.java:701)

... 19 more

<project name="Calculadora" default="rebuild" basedir="." xmlns:jacoco="antlib:org.jacoco.ant">
   <property name="src" location="./src"/>
   <property name="bin.dir" location="./bin"/>
   <property name="bin.report.dir" location="${bin.dir}/report"/>
   <property name="bin.exec.file" location="${bin.dir}/jacoco.exec"/>
   <property name="junit.out.dir" location="${bin.report.dir}/junit/xml"/>
   <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
      <classpath path="/tmp/jacocoant4002041518230825590.jar"/>
   </taskdef>
   <path id="classpath">
      <pathelement location="${bin.dir}"/>
      <pathelement location="${src}"/>
      <pathelement location="/usr/lib/eclipse/plugins/org.junit4_4.5.0.v20090824/junit.jar"/>
   </path>
   <target name="clean">
      <mkdir dir="${bin.report.dir}"/>
      <mkdir dir="${junit.out.dir}"/>
   </target>
   <target name="test" depends="clean">
      <jacoco:coverage destfile="${bin.exec.file}">
         <junit fork="true" forkmode="once">
            <classpath refid="classpath"/>
            <formatter type="xml" usefile="true"/>
            <test name="functions.test.ReadFile" todir="${junit.out.dir}"/>
         </junit>
      </jacoco:coverage>
   </target>
   <target name="report" depends="test">
      <jacoco:report>
         <executiondata>
            <file file="${bin.exec.file}"/>
         </executiondata>
         <structure name="">
            <classfiles>
               <fileset dir="${bin.dir}"/>
            </classfiles>
            <sourcefiles encoding="UTF-8">
               <fileset dir="${src}"/>
            </sourcefiles>
         </structure>
         <xml destfile="${bin.report.dir}/report.xml"/>
      </jacoco:report>
      <junitreport todir="${junit.out.dir}">
         <fileset dir="${junit.out.dir}">
            <include name="TEST-*.xml"/>
         </fileset>
      </junitreport>
   </target>
   <target name="rebuild" depends="clean,test,report"/>
</project>

E o código para executar o ant em java é este:

// Creates a new Project object
Project p = new Project();
p.setUserProperty("ant.file", buildFile.getAbsolutePath());
p.init();

ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
helper.parse(p, buildFile);

DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);

p.executeTarget(p.getDefaultTarget());

No entanto se executar esse xml na consola, funciona na perfeição....

O que pode ser?  🤔

cumps  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
zecapistolas

O que pode ser?  🤔

Encontrei o problema....  :cheesygrin: Faltava adicionar ao xml isto:

<pathelement location="./lib/ant-1.8.0.jar"/>
<pathelement location="./lib/ant-junit-1.8.0.jar"/>

No entanto agora aparece o seguinte warning:

[junit] WARNING: multiple versions of ant detected in path for junit

Como posso retirar esse warning?  🤔

cumps  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.