You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ant.apache.org by Brian Topping <to...@digidemic.com> on 2001/08/18 21:04:10 UTC

Ant Classpath -- PLEASE HELP

Greetings and salutations,

I'm trying to get Ant working with an external taskdef, but without
configuring the CLASSPATH of the Ant itself.  So I've added the
following to my build.xml:

	<property name="enhydra.root" value="C:/eas4/lutris-eas4"/>
	<property name="enhydra.output" value="C:/eas4/lutris-eas4"/>
	<property name="enhydra.liboutput"
value="C:/eas4/lutris-eas4/lib"/>
	<property name="enhydra.jdkdir" value="C:/jdk1.3.1"/>
	<path id="xmlc.classpath">
		<fileset dir="${enhydra.liboutput}">
			<include name="build.jar"/>
			<include name="boot.jar"/>
			<include name="kernel.jar"/>
			<include name="xmlc.jar"/>
			<include name="wireless.jar"/>
			<include name="LutrisWireless.jar"/>
			<include name="dods.jar"/>
			<include name="ctxrmic.jar"/>
		</fileset>
		<fileset dir="${enhydra.jdkdir}/lib">
			<include name="tools.jar"/>
		</fileset>
	</path>
	<taskdef name="xmlc" classname="org.enhydra.ant.taskdefs.Xmlc"
		classpathref="xmlc.classpath"/>

Did I set this up correctly?  I am trying to get the CLASSPATH that is
set up for both Ant (when it executes taskdef
org.enhydra.ant.taskdefs.Xmlc) and org.enhydra.ant.taskdefs.Xmlc itself
(it has a bunch of libraries that it needs to be successful).  What I
get when I run it with 1.3 is:

java.io.IOException: java.lang.NoClassDefFoundError:
org/enhydra/error/ChainedException
        at
org.apache.tools.ant.AntClassLoader.getClassFromStream(AntClassLoader.ja
va:439)
        at
org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:492)
        at
org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:465)
        at
org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:369)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
        at org.enhydra.xml.xmlc.commands.xmlc.XMLC.<init>(XMLC.java:49)
        at org.enhydra.xml.xmlc.commands.xmlc.XMLC.main(XMLC.java:128)
        at java.lang.reflect.Method.invoke(Native Method)
        at org.enhydra.ant.taskdefs.Xmlc.execute(Xmlc.java:549)
        at org.apache.tools.ant.Target.execute(Target.java:153)
        at org.apache.tools.ant.Project.runTarget(Project.java:898)
        at org.apache.tools.ant.Project.executeTarget(Project.java:536)
        at org.apache.tools.ant.Project.executeTargets(Project.java:510)
        at org.apache.tools.ant.Main.runBuild(Main.java:421)
        at org.apache.tools.ant.Main.main(Main.java:149)
java.lang.reflect.InvocationTargetException:
java.lang.NoClassDefFoundError: org/enhydra/xml/xmlc/XMLCException
        at org.enhydra.xml.xmlc.commands.xmlc.XMLC.<init>(XMLC.java:49)
        at org.enhydra.xml.xmlc.commands.xmlc.XMLC.main(XMLC.java:128)
        at java.lang.reflect.Method.invoke(Native Method)
        at org.enhydra.ant.taskdefs.Xmlc.execute(Xmlc.java:549)
        at org.apache.tools.ant.Target.execute(Target.java:153)
        at org.apache.tools.ant.Project.runTarget(Project.java:898)
        at org.apache.tools.ant.Project.executeTarget(Project.java:536)
        at org.apache.tools.ant.Project.executeTargets(Project.java:510)
        at org.apache.tools.ant.Main.runBuild(Main.java:421)
        at org.apache.tools.ant.Main.main(Main.java:149)

Everything seems to be working fine up to
org.enhydra.ant.taskdefs.Xmlc.execute(Xmlc.java:549) (line 549 is
highlighted):

        } else {
          String [] _args = (String[])args.toArray(new
String[args.size()]);

          // Execute XMLC directly.  This requires that enhydra.jar, or
an equivalent
          // path containing the needed DOM code is on the CLASSPATH of
ANT.
          String xmlcClassName =
"org.enhydra.xml.xmlc.commands.xmlc.XMLC";

          Method      m = null;
          Class       c = null;
          try {
              c = Class.forName(xmlcClassName);
              m = c.getMethod("main", new Class[] { String[].class });

          } catch(Exception e) {
              // Reflection errors.  Class or method does not exist!
              e.printStackTrace();
              throw new BuildException(e);
          }

          if (m != null) {
549->              m.invoke(null,new Object[] { _args });
          }
        }
      } catch(InvocationTargetException ite) {
        ite.printStackTrace();
        throw new BuildException(ite);

Basic reflection code, right?  The class is found and the method call
works.  But the comments at the top of this block state that the
relevant JAR files must be already on the Ant CLASSPATH.  Problem is, I
cannot do that, I am trying to run this build in NetBeans/Forte 3.x and
there is a confirmed problem with the library compatibility between
Enhydra and NB.  I believe I need to use the classpath attribute in the
Antfile taskdef in order to get around this NB library problem.

Moving up the call chain, the source of the real error is in XMLC.java
line 49, and it is failing to instantiate a class that exists in the
same package and jar file as the caller itself!  So somehow it seems
that the CLASSPATH is initially getting set up correctly by the code in
the build.xml, but it is not surviving the reflection call through the
method interface since the first instantiation of another object from
that JAR is failing.  *THIS* is the problem I am trying to solve.  How
can I make the CLASSPATH that is getting set up in the Build.xml
"sticky"??!??!!?

I hope this all makes some semblance of sense to someone that can offer
tips toward a solution.  I've beat on this nonstop for a solid day and
have come up with a little over nothing...



Thanks very kindly for your consideration,


Brian Topping

RE: Ant Classpath -- Help Requested

Posted by Conor MacNeill <co...@cortexebusiness.com.au>.
Brian,

First, please try this under 1.4 Beta. I have made some changes to Ant's
classloading with respect to <taskdef> which may have an impact. The next
step is to run ant -debug. You will see Ant's classloader spewing out a
whole stack of messages about where it is loading classes. Finally, or maybe
firstly, check whether org/enhydra/error/ChainedException is in the
classpath you have defined.

Conor


> -----Original Message-----
> From: Brian Topping [mailto:topping@digidemic.com]
> Sent: Tuesday, 21 August 2001 3:44 AM
> To: ant-dev@jakarta.apache.org
> Subject: Ant Classpath -- Help Requested
>
>
> Greetings and salutations,
>
> I first sent this to the Ant-user list, but got no response so I thought
> I would try here.  It is rather technical in nature, so maybe I should
> have started here, but I was saving this list for a last resort.
>
> I'm trying to get Ant working with an external taskdef, but without
> configuring the CLASSPATH of the Ant itself.  So I've added the
> following to my build.xml:
>
> 	<property name="enhydra.root" value="C:/eas4/lutris-eas4"/>
> 	<property name="enhydra.output" value="C:/eas4/lutris-eas4"/>
> 	<property name="enhydra.liboutput"
> value="C:/eas4/lutris-eas4/lib"/>
> 	<property name="enhydra.jdkdir" value="C:/jdk1.3.1"/>
> 	<path id="xmlc.classpath">
> 		<fileset dir="${enhydra.liboutput}">
> 			<include name="build.jar"/>
> 			<include name="boot.jar"/>
> 			<include name="kernel.jar"/>
> 			<include name="xmlc.jar"/>
> 			<include name="wireless.jar"/>
> 			<include name="LutrisWireless.jar"/>
> 			<include name="dods.jar"/>
> 			<include name="ctxrmic.jar"/>
> 		</fileset>
> 		<fileset dir="${enhydra.jdkdir}/lib">
> 			<include name="tools.jar"/>
> 		</fileset>
> 	</path>
> 	<taskdef name="xmlc" classname="org.enhydra.ant.taskdefs.Xmlc"
> 		classpathref="xmlc.classpath"/>
>
> Did I set this up correctly?  I am trying to get the CLASSPATH that is
> set up for both Ant (when it executes taskdef
> org.enhydra.ant.taskdefs.Xmlc) and org.enhydra.ant.taskdefs.Xmlc itself
> (it has a bunch of libraries that it needs to be successful).  What I
> get when I run it with 1.3 is:
>
> java.io.IOException: java.lang.NoClassDefFoundError:
> org/enhydra/error/ChainedException
>         at
> org.apache.tools.ant.AntClassLoader.getClassFromStream(AntClassLoader.ja
> va:439)
>         at
> org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:492)
>         at
> org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:465)
>         at
> org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:369)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
>         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
>         at org.enhydra.xml.xmlc.commands.xmlc.XMLC.<init>(XMLC.java:49)
>         at org.enhydra.xml.xmlc.commands.xmlc.XMLC.main(XMLC.java:128)
>         at java.lang.reflect.Method.invoke(Native Method)
>         at org.enhydra.ant.taskdefs.Xmlc.execute(Xmlc.java:549)
>         at org.apache.tools.ant.Target.execute(Target.java:153)
>         at org.apache.tools.ant.Project.runTarget(Project.java:898)
>         at org.apache.tools.ant.Project.executeTarget(Project.java:536)
>         at org.apache.tools.ant.Project.executeTargets(Project.java:510)
>         at org.apache.tools.ant.Main.runBuild(Main.java:421)
>         at org.apache.tools.ant.Main.main(Main.java:149)
> java.lang.reflect.InvocationTargetException:
> java.lang.NoClassDefFoundError: org/enhydra/xml/xmlc/XMLCException
>         at org.enhydra.xml.xmlc.commands.xmlc.XMLC.<init>(XMLC.java:49)
>         at org.enhydra.xml.xmlc.commands.xmlc.XMLC.main(XMLC.java:128)
>         at java.lang.reflect.Method.invoke(Native Method)
>         at org.enhydra.ant.taskdefs.Xmlc.execute(Xmlc.java:549)
>         at org.apache.tools.ant.Target.execute(Target.java:153)
>         at org.apache.tools.ant.Project.runTarget(Project.java:898)
>         at org.apache.tools.ant.Project.executeTarget(Project.java:536)
>         at org.apache.tools.ant.Project.executeTargets(Project.java:510)
>         at org.apache.tools.ant.Main.runBuild(Main.java:421)
>         at org.apache.tools.ant.Main.main(Main.java:149)
>
> Everything seems to be working fine up to
> org.enhydra.ant.taskdefs.Xmlc.execute(Xmlc.java:549) (line 549 is
> highlighted):
>
>         } else {
>           String [] _args = (String[])args.toArray(new
> String[args.size()]);
>
>           // Execute XMLC directly.  This requires that enhydra.jar, or
> an equivalent
>           // path containing the needed DOM code is on the CLASSPATH of
> ANT.
>           String xmlcClassName =
> "org.enhydra.xml.xmlc.commands.xmlc.XMLC";
>
>           Method      m = null;
>           Class       c = null;
>           try {
>               c = Class.forName(xmlcClassName);
>               m = c.getMethod("main", new Class[] { String[].class });
>
>           } catch(Exception e) {
>               // Reflection errors.  Class or method does not exist!
>               e.printStackTrace();
>               throw new BuildException(e);
>           }
>
>           if (m != null) {
> 549->              m.invoke(null,new Object[] { _args });
>           }
>         }
>       } catch(InvocationTargetException ite) {
>         ite.printStackTrace();
>         throw new BuildException(ite);
>
> Basic reflection code, right?  The class is found and the method call
> works.  But the comments at the top of this block state that the
> relevant JAR files must be already on the Ant CLASSPATH.  Problem is, I
> cannot do that, I am trying to run this build in NetBeans/Forte 3.x and
> there is a confirmed problem with the library compatibility between
> Enhydra and NB.  I believe I need to use the classpath attribute in the
> Antfile taskdef in order to get around this NB library problem.
>
> Moving up the call chain, the source of the real error is in XMLC.java
> line 49, and it is failing to instantiate a class that exists in the
> same package and jar file as the caller itself!  So somehow it seems
> that the CLASSPATH is initially getting set up correctly by the code in
> the build.xml, but it is not surviving the reflection call through the
> method interface since the first instantiation of another object from
> that JAR is failing.  *THIS* is the problem I am trying to solve.  How
> can I make the CLASSPATH that is getting set up in the Build.xml
> "sticky"??!??!!?
>
> I hope this all makes some semblance of sense to someone that can offer
> tips toward a solution.  I've beat on this nonstop for a solid day and
> have come up with a little over nothing...
>
>
>
> Thanks very kindly for your consideration,
>
>
> Brian Topping
>