ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David E Noel <den...@us.ibm.com>
Subject Re: ClassLoader issues with Ant 1.6.x and the <junit> task
Date Mon, 28 Mar 2005 16:50:44 GMT
I'm still stuck on this.  Any ideas?


Dave Noel
denoel@us.ibm.com



David E Noel/Burlington/Contr/IBM@IBMUS 
03/24/2005 06:53 PM
Please respond to
"Ant Users List"


To
user@ant.apache.org
cc

Subject
ClassLoader issues with Ant 1.6.x and the <junit> task






Hello fellow ant users.  I have a problem with ant and junit that I am 
pretty sure is a class loader problem.  When I run the junit task on my 
test cases I always get a ClassNotFoundException on my test case classes. 
I am sure they are on the classpath so that makes me think it is a class 
loader problem. 

Here is what the error looks like when I run my ant build


Buildfile: build.xml
Trying to override old definition of datatype junit

init:

compile:

unit:
    [junit] Running com.mycom.MyClassTestCase
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
    [junit] Testsuite: com.mycom.MyClassTestCase
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec

    [junit] Null Test:  Caused an ERROR
    [junit] com.mycom.MyClassTestCase
    [junit] java.lang.ClassNotFoundException: com.mycom.MyClassTestCase
    [junit]     at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
    [junit]     at java.security.AccessController.doPrivileged(Native 
Method)
    [junit]     at 
java.net.URLClassLoader.findClass(URLClassLoader.java:187)
    [junit]     at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
    [junit]     at 
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
    [junit]     at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
    [junit]     at 
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
    [junit]     at java.lang.Class.forName0(Native Method)
    [junit]     at java.lang.Class.forName(Class.java:141)

I get this error when I run the unit task from my build.xml file.  Here is 

my build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" default="dist" basedir=".">
        <property name="source_dir" value="."/>
        <property name="build_dir" value="${basedir}/build"/>
        <property name="distribute_dir" value="dist"/>
 
        <!-- these will be set by the calling builder.  They are defined 
here so we can run in standalone mode -->
        <property name="javac.debug" value="true" />
        <property name="javac.debuglevel" value="source" />
        <property name="javac.exe" value="${java.home}/../bin/javac" />
        <property name="javac.deprecation" value="off"/>
        <property name="javac.verbose" value="no"/>
        <property name="javac.optimize" value="off"/>
        <property name="javac.nowarn" value="off"/>

                <taskdef name="junit" 
classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
                  <classpath>
                    <fileset 
file="${basedir}/../ThirdPartyJavaLibs/ant-junit.jar"/>  <!-- I want this 
to be <classpath refid="project.classpath" />  but I am leaving like this 
to demonstrate where I moved the junit jars to-->
                    <fileset 
file="${basedir}/../ThirdPartyJavaLibs/junit.jar"/>
                  </classpath>
                </taskdef>

 
         <path id="project.classpath">
                   <fileset dir="${basedir}/../ThirdPartyJavaLibs">
                     <include name="**/*.jar"/>
           </fileset> 
           <fileset dir="${build_dir}">
             <include name="**/*.class"/>
           </fileset>
                 </path>

        <target name="init">
                <tstamp/>
                <mkdir dir="${build_dir}" />
                <mkdir dir="${distribute_dir}/lib"/>
        </target>
 
        <target name="compile" depends="init">
                <javac deprecation="${javac.deprecation}" 
                                               verbose="${javac.verbose}" 
                                               optimize="${java.optimize}" 


                                               nowarn="${javac.nowarn}" 
                                               srcdir="${source_dir}" 
                                               destdir="${build_dir}" 
                                               executable="${javac.exe}" 
                                               fork="true" 
                                              debug="${javac.debug}" 
 debuglevel="${javac.debuglevel}">
                                       <classpath 
refid="project.classpath"/>
                                 </javac>
        </target>
 
        <target name="dist" depends="compile">
                <jar 
jarfile="${distribute_dir}/lib/${ant.project.name}.jar">
                        <fileset dir="${build_dir}">
                                <include name="**/*.class"/>
                                <exclude name="**/*TestCase.class"/>
                        </fileset>
                </jar>
        </target>
 
        <target name="clean" depends="init">
                <delete dir="${distribute_dir}"/>
                <delete dir="${build_dir}"/>
        </target>
 
        <target name="unit" depends="compile">
                <junit printsummary="yes" fork="yes">
                                                <classpath 
refid="project.classpath"/>
                        <formatter type="brief" usefile="false"/>
                        <batchtest todir="${distribute_dir}">
                                <fileset dir="${build_dir}">
                                        <include 
name="**/*TestCase.class"/>
                                </fileset>
                        </batchtest>
                </junit>
        </target>
</project>


After reading the ant FAQ about classloaders it sounds like I needed to 
pull the ant-junit.jar and junit.jar classes out of the $ANT_HOME/lib dir. 

 That is why I added the taskdef for the junit task in the buildfile. That 

did not work for me though.
So I get the above error regardless if ant-junit.jar and junit.jar are in 
the $ANT_HOME/lib dir or not.

Also I did not start getting the warning about the junit task until I set 
up a junit taskdef when I moved the jars out of $ANT_HOME/lib.  I'm not 
sure if this warning is a problem or not.

Another interesting error I noticed(I'm not sure if it is related to the 
same problem) is that if I change fork="yes" to fork="no" in the junit 
task attributes I get the following error

Buildfile: build.xml
Trying to override old definition of datatype junit

init:

compile:

unit:
    [junit] Running 
com.ibm.md.tse.dmiw.security.logic.SecurityControlTableLogicImplTestCase

BUILD FAILED
C:\build.xml:71: 
org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter is 
not a JUnitResultFormatter


So I am hoping someone out there can help me.  I'm not sure what I can do. 

 Performing a Google search has produced many forum posts where this 
problem is discussed but I have yet to find one where someone produces a 
solution.

I forgot to mention I am running a 1.4.2 java vm



Dave Noel
denoel@us.ibm.com

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message