You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ant.apache.org by Dave Sowerby <da...@gmail.com> on 2007/05/19 07:13:10 UTC

scriptdef/ant funny

Hi All,

I've found rather odd behaviour in the use of scriptdef and I wondered
if anyone had come across it before and knew of any workaround?

If in a master project I initialise a scriptdef which sets a property
and then call another build file with <ant which then calls that
scriptdef the initialised scriptdef operates within the master
project, meaning that all properties etc are not available to my
"child" project.

Here's an example:

build.xml:

<project name="main">
   <scriptdef name="projectdetails" language="beanshell">
       <attribute name="name" />
       System.out.println("Setting property " + attributes.get("name"));
       project.setProperty(attributes.get("name"), attributes.get("name"));
   </scriptdef>

   <projectdetails name="property" />
   <echo>In ${ant.project.name}: ${property}</echo>
   <echo>forking to new Project:</echo>
   <ant antfile="child.xml" inheritRefs="true" />
   <echo>Returned from new Project.</echo>
   <echo>In ${ant.project.name}: ${childproperty}</echo>
</project>

child.xml:

<project name="child" default="default">
    <target name="default">
        <projectdetails name="childproperty" />
        <echo>In ${ant.project.name}: ${property}</echo>
        <echo>In ${ant.project.name}: ${childproperty}</echo>
    </target>
</project>

With the output of:

Buildfile: build.xml
[projectdetails] Setting property property
     [echo] In main: property
     [echo] forking to new Project:

default:
[projectdetails] Setting property childproperty
     [echo] In child: property
     [echo] In child: ${childproperty}
     [echo] Returned from new Project.
     [echo] In main: childproperty

Obviously, this is a contrived example to make it easier to
demonstrate.  I believe that the scriptdef is initialised at the point
of declaration and provided with a project object at that point and
then reused; my problem is that I expected the behaviour to mirror
that of ant-tasks/macrodefs, ie if I replace the scriptdef above with
a functionally equivilant macrodef I get the following output:

Buildfile: build.xml
     [echo] Setting property property
     [echo] In main: property
     [echo] forking to new Project:

default:
     [echo] Setting property childproperty
     [echo] In child: property
     [echo] In child: childproperty
     [echo] Returned from new Project.
     [echo] In main: ${childproperty}

Which is exactly the behavior that I'd expected based upon the
description of the <ant and <antcall targets.  Does anyone know if
this is a bug, or expected behaviour - also whether or not there is
any means of declaring a scriptdef to be reinitialised at each point
of use?

Thanks in advance,

Dave.

-- 
Dave Sowerby MEng MBCS

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@ant.apache.org
For additional commands, e-mail: user-help@ant.apache.org