2009-10-15 18 views
16

Tengo problemas para ejecutar mi programa Java (utiliza algunos JAR de terceros). Puedo compilarlo bien, pero cuando llamo a mi objetivo de ejecución en ant, dice que no puede encontrar la clase que dije que se ejecuta en el classpath. Esto es lo que mi build.xml parece:Problemas con la configuración del classpath en ant

<project basedir="." default="build"> 
<property name="build" value="build" /> 
<property name="src" value="." /> 
<property name="lib" value="lib" /> 

<path id="classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
    <fileset dir="${build}"> 
     <include name="*.class" /> 
    </fileset> 
</path> 

<target name="build"> 
    <javac srcdir="${src}" destdir="${build}"> 
     <classpath refid="classpath" /> 
    </javac> 
</target> 

<target name="run"> 
    <java classname="FirstClass"> 
     <classpath refid="classpath" /> 
    </java> 
</target> 

¿Alguien sabe lo que podría estar haciendo mal?


Aquí está mi seguimiento de la pila de la hormiga:

ant run Buildfile: build.xml 

run: 
[java] Could not find GuiStarter. Make sure you have it in your classpath 
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:138) 
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:764) 
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:218) 
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:132) 
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:105) 
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[java] at java.lang.reflect.Method.invoke(Method.java:616) 
[java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
[java] at org.apache.tools.ant.Task.perform(Task.java:348) 
[java] at org.apache.tools.ant.Target.execute(Target.java:357) 
[java] at org.apache.tools.ant.Target.performTasks(Target.java:385) 
[java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) 
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1306) 
[java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
[java] at org.apache.tools.ant.Project.executeTargets(Project.java:1189) 
[java] at org.apache.tools.ant.Main.runBuild(Main.java:758) 
[java] at org.apache.tools.ant.Main.startAnt(Main.java:217) 
[java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) 
[java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) 
[java] Java Result: -1 

BUILD SUCCESSFUL Total time: 1 second 
+0

es el directorio lib contenidos dentro del directorio src? Si tiene un directorio src separado que se usa como baseir, y lib está en el mismo nivel que src, entonces tendría que hacer basedir ... y especificar property src como el directorio fuente. O podría mover su script Ant hasta un directorio. –

+0

¿Utiliza el paquete predeterminado en sus fuentes? Si no, probablemente deba incluir "**/*. Clase" en su classpath. –

Respuesta

3

La forma en que es - sólo frascos dentro lib directorio relativo a la ruta están siendo cargado. ¿Tienes todos los frascos de la 3ª fiesta allí? Es posible que haya algunas bibliotecas en tiempo de ejecución que no necesita en tiempo de compilación pero que faltan en tiempo de ejecución. Si publica su stacktrace, le diré más :)

+0

Mi stacktrace no cabía en este comentario, así que lo hice una respuesta a esta pregunta. – David

+0

Hm - GuiStarter parece que tiene una clase que no tiene un paquete (¿es uno de los suyos?) - en cuyo caso debe asegurarse de que su directorio de nivel superior se encuentre en Classpath también – Bostone

+0

Gracias, eso fue realmente útil ! Incluso 3 años después :) –

5

Creo que el problema está en su declaración de ruta classpath. El directorio debe ser un build<pathelement>

<path id="classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
    <pathelement location="${build}" /> 
</path> 

Además, yo sólo incluyen frascos de 3 rd partido en su classpath refid. Entonces todo el bloque parece.

<path id="3rd-party-classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 

<target name="build"> 
    <javac srcdir="${src}" destdir="${build}"> 
     <classpath refid="3rd-party-classpath" /> 
    </javac> 
</target> 

<target name="run"> 
    <java classname="FirstClass"> 
     <classpath> 
     <pathelement location="${build}" /> 
     <path refid="3rd-party-classpath" /> 
     </classpath> 
    </java> 
</target> 

Además, como ha señalado DroidIn.net, debe crear un paquete para su programa.

+0

Estoy de acuerdo - Creo que "pathelement" eso es lo que usas para las clases – Bostone

+0

Con estas modificaciones obtengo una excepción java.lang.NoClassDefFoundError: com/sun/media/codec/audio/AudioCodec en lugar de a No se pudo encontrar GuiStarter. Asegúrate de tenerlo en tu error classpath. Creo que para este proyecto sería más fácil poner las jarras en mi directorio ant lib. – David

+0

NO coloque los frascos en el directorio ant lib. Parece que las herramientas de la 3ª parte dependen de la biblioteca anterior. Tal vez esto te indique la dirección correcta http://ubuntuforums.org/archive/index.php/t-351989.html –

0

Prueba esto, podría ejecutar mi clase.

<property name="src.dir" value="src" /> 
<property name="build.dir" value="build" /> 
<property name="classes.dir" value="${build.dir}/classes" /> 
<property name="jar.dir" value="${build.dir}/jar" /> 
<property name="main-class" value="sample.Sample" /> 

<target name="clean"> 
    <delete dir="${classes.dir}" /> 
</target> 

<path id="classpath"> 
    <fileset dir="${jar.dir}"> 
     <include name="*.jar" /> 
    </fileset> 
    <fileset dir="${classes.dir}"> 
     <include name="/*.class" /> 
    </fileset> 
</path> 

<target name="compile"> 
    <mkdir dir="${classes.dir}" /> 
    <javac srcdir="${src.dir}" destdir="${classes.dir}"> 
     <classpath refid="classpath" /> 
    </javac> 
</target> 

<target name="jar" depends="compile"> 
    <mkdir dir="${jar.dir}" /> 
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}"> 
     <manifest> 
      <attribute name="Main-Class" value="${main-class}" /> 
     </manifest> 
    </jar> 
</target> 

<target name="run" depends="jar"> 
    <java classname="${main-class}"> 
     <classpath refid="classpath" /> 
    </java> 
</target> 

<target name="clean-build" depends="clean,jar" /> 

<target name="main" depends="clean,run" /> 

Cuestiones relacionadas