2009-08-01 8 views
8

No puedo entender por qué estoy obteniendo esta excepción de mi archivo ant build.xml. Revisé y todo está en el classpath. ¿Por qué debe ser esto tan complicado?otra java.lang.ClassNotFoundException en la tarea junit de la hormiga

Tuve problemas con Ant en el pasado y parece que siempre es algo relacionado con el classpath. Estoy señalando junit.jar usando ambas formas: dentro de eclipse: window-> preferences-> ant-> runtime-> Ant Home-> Add External Jars, y también dentro del script build.xml. Esta vez, Ant no puede ubicar mi clase de prueba en la tarea junit. ¿Hay algún problema con la forma en que estoy apuntando a esta clase?

<target name="init"> 
    <property name="sourceDir" value="src"/> 
    <property name="outputDir" value="build" /> 
    <property name="junitLocation" value="C:\...\org.junit4_4.3.1\junit.jar" /> 
</target> 

<target name="clean" depends="init"> 
    <delete dir="${outputDir}" /> 
</target> 

<target name="prepare" depends="clean"> 
    <mkdir dir="${outputDir}" /> 
</target> 

<target name="compile" depends="prepare"> 
    <javac srcdir="${sourceDir}" destdir="${outputDir}" classpath="${junitLocation}"/> 
</target> 

<path id="classpath"> 
    <pathelement location="${outputDir}" /> 
    <pathelement location="${junitLocation}" /> 
</path> 

<target name="testApplication" depends="compile"> 
    <echo>Running the junit tests...</echo> 
    <junit fork="yes" haltonfailure="yes"> 
     <test name="my.package.MyTest" /> 
     <formatter type="plain" usefile="false" />  
     <classpath refid="classpath" /> 
    </junit> 
</target> 

siempre estoy recibiendo:

[junit] Testsuite: my.package.MyTest 
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec 
    [junit]  Caused an ERROR 
    [junit] my.package.MyTest 
    [junit] java.lang.ClassNotFoundException: my.package.MyTest 
    [junit]  at java.net.URLClassLoader$1.run(Unknown Source) 
    [junit]  at java.security.AccessController.doPrivileged(Native Method) 
    [junit]  at java.net.URLClassLoader.findClass(Unknown Source) 
    [junit]  at java.lang.ClassLoader.loadClass(Unknown Source) 
    [junit]  at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    [junit]  at java.lang.ClassLoader.loadClass(Unknown Source) 
    [junit]  at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
    [junit]  at java.lang.Class.forName0(Native Method) 
    [junit]  at java.lang.Class.forName(Unknown Source) 

BUILD FAILED 

Al parecer, hormiga encuentra junit.jar y los intentos de iniciar la prueba, pero por qué no puede encontrar mi clase de prueba? Señalo la carpeta con clase de prueba compilada. Así que sé que Junit está en el camino de clases de Ant al menos, pero el ClassNotFound me desconcierta.

¿Alguna idea quizás? ¡Muchas gracias!

+0

Solo marcando: ¿ves ./build/my/package/MyTest.class? ¿Estás seguro de que se construye correctamente? – duffymo

+0

sí, puedo ver la clase compilada, en el directorio correcto, no hay problema allí – denchr

Respuesta

6

¿Está seguro de que su clase de prueba se encuentra en la carpeta build? Está invocando junit en una JVM separada (fork = true) por lo que es posible que la carpeta de trabajo cambie durante esa invocación y con build siendo relativa, eso puede causar un problema.

Ejecutar ant desde la línea de comandos (no desde Eclipse) con -verbose o -debug cambiar para ver el directorio de clase/trabajo detallado dir junit se está invocando con y publicar los resultados aquí si todavía no puede resolver esto problema.

+0

¡Estaré en peligro! ¡Creo que estás haciendo algo! Cambié el guión a ¡y funcionó! ¿Hay algunas desventajas particulares para configurar el tenedor = no? – denchr

+0

Genera una nueva JVM. A menos que sea necesario que lo haga, puede dejarlo para que sus pruebas se ejecuten en proceso con hormiga. O, si usa fork, establezca el atributo 'dir' para especificar explícitamente su carpeta de trabajo. – ChssPly76

+0

La bifurcación es útil si las pruebas usan mucha memoria; cuando fork = yes puede establecer la maxmemory que hace un -Xmx en la instancia JVM bifurcada. – Spyder

2

No necesita agregar el jar JUnit al classpath. Si la hormiga no puede encontrarlo, la tarea <junit> no se ejecutará.

Sugiero probar diferentes formas de especificar el classpath como se describe en el documento ant en http://ant.apache.org/manual/using.html#path; específicamente <classpath path="${srcdir}" /> podría ayudar.

Si no, la sugerencia de ChssPly76 de ejecutar ant -debug desde la línea de comandos es la mejor opción. Sin embargo, querrá aumentar el búfer en la ventana del símbolo del sistema, porque el depurador de ant es extremadamente detallado.

+1

Se equivoca al decir que '' no se está ejecutando sin junit.jar. Desde Ant 1.7 es posible poner junit.jar en classpath de la tarea '' siempre que 'ant-junit.jar' esté disponible para Ant. Dicho esto, estoy de acuerdo en que no es necesariamente el mejor enfoque. – ChssPly76

+0

No sé por qué esto fue rechazado. +1 para compensar – ChssPly76

+0

Gracias por eso. No uso Ant 1.7 mucho :) – Spyder

Cuestiones relacionadas