Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

zecapistolas

Executar Ant via Java

Recommended Posts

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  ;)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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  ;)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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  ;)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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  ;)

Share this post


Link to post
Share on other 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  ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.