I was supprised that the <taskdef> you described
worked for scp, I think that you have removed the
ant-jsch.jar from from $ANT_HOME/lib.

I tryed the following without removing ant-jsch.jar from
$ANT_HOME/lib and got the expected build failure.
build.xml:
<project default="x">
 <target name="x">
   <property name="src.tools.dir" location="${user.home}/apps"/>
   <path id="jsch.path">
     <pathelement location="${src.tools.dir}/jsch/ant-jsch.jar"/>
     <pathelement location="${src.tools.dir}/jsch/jsch-0.1.33.jar"/>
   </path>
   <taskdef
     name="scp"
     classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp"
     classpathref="jsch.path"/>

   <scp hello="world"/>
 </target>
</project>

result:
BUILD FAILED
/work/reilly/learning/a/jsch/build.xml:11: taskdef A class needed by
class org.apache.tools.ant.taskdefs.optional.ssh.Scp cannot be found:
com/jcraft/jsch/UserInfo



On 6/7/07, Kevin Jackson <[EMAIL PROTECTED]> wrote:
Hi all,

For obscure reasons, I have to redefine the core email task using a taskdef.
This is my build file:
<path id="jsch.path">
  <pathelement location="${src.tools.dir}/jsch/ant-jsch.jar"/>
  <pathelement location="${src.tools.dir}/jsch/jsch-0.1.33.jar"/>
</path>
<taskdef name="scp"
                classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp"
                classpathref="jsch.path"/>

<taskdef name="sshexec"
classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"
classpathref="jsch.path"/>

<taskdef name="mail"
                classname="org.apache.tools.ant.taskdefs.email.EmailTask">
        <classpath>
          <pathelement location="${src.tools.dir}/mail/ant-javamail.jar"/>
          <pathelement location="${src.tools.dir}/mail/mail.jar"/>
        </classpath>
</taskdef>

Now the strange thing is that thescp & sshexec tasks report that they
have been over-ridden by the new definitions, and with -debug enabled
I can see the correct classes being loaded.  The mail task however
just reports ' Class org.apache.tools.ant.taskdefs.email.EmailTask
loaded from parent loader (parentFirst)'.

Then finally it fails with ClassNotFoundException.  This means that
the <classpath> is ignored for the mail taskkdef, but is used
correctly for the scp/sshexec taskdefs.

I would think it would make sense to treat all taskdefs & classpaths equal...
They are for <taskdef>.

In ant1.7.0 only junit has been coded to allow the dependent classes
to be defined in an embedded classpath.
In ant1.7.1 this has been extended to the <script> family.

The code involved uses classloader tricks that are not too
easy to generalize to the other class dependent optional tasks.


I cannot copy the jars into ~/.ant/lib, or $ANT_HOME/lib, and I cannot
rely on a CLASSPATH variable or an external calling script.  The only
way I can make what I want to do work is via the taskdefs which honour
the <classpath> or classpathref.  Does anyone know how to work around
this?

See http://ant.apache.org/faq.html#delegating-classloader
for a description of the problem.

In my build files, I use the excellent
[antlib:net.jtools.classloadertask]classloader
task:

from http://enitsys.sourceforge.net/ant-classloadertask/
   <typedef uri="antlib:net.jtools.classloadertask"
            resource="net/jtools/classloadertask/antlib.xml">
     <classpath>
       <fileset
         dir="${user.home}/tools/ant-classloader"
              includes="*.jar"/>
     </classpath>
   </typedef>


   <cl:classloader loader="project">
     <classpath>
       <fileset dir="${src.tools.dir}/jsch/" includes="js*.jar"/>
     </classpath>
   </cl:classloader>
   <scp hello="world"/>


Peter


Thanks,
Kev

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to