2010-01-01 6 views
8

Tengo el siguiente archivo de compilación para Ant y trato de usar la 'ejecución' de destino para ejecutar el programa.ayuda con el archivo ant - classpath para la tarea de Java

<property name="springjar" location="E:/Tools/spring-30/dist/" /> 
<property name="logjar"  location="E:/Tools/commons-logging-1.1.1/" /> 

<patternset id="jar.files"><include name="**/*.jar"/></patternset> 

<path id="springlearn.classpath"> 
    <fileset dir="${springjar}"><patternset refid="jar.files"/></fileset> 
    <fileset dir="${logjar}"><patternset refid="jar.files"/></fileset> 
</path> 


<target name="run" depends="dist" description="Execute the Java Program"> 
    <java dir ="." fork="true" jar="dist\app.jar" classpathref ="springlearn.classpath"> 
    </java> 
</target> 

Utilizando el mismo classpathref, soy capaz de compilar correctamente & crear el frasco, pero cuando utilice el desplazamiento con destino, me sale el error abajo

java.lang.NoClassDefFoundError: org/springframework/core/io/Resource 
Caused by: java.lang.ClassNotFoundException: org.springframework.core.io.Resource 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:289) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 

Excepción en el hilo "principal"

Cualquier ayuda es muy apreciada. Gracias

+0

¿dónde está el objetivo "dist"? – skaffman

Respuesta

7

Aquí hay un Ant build.xml genérico que funciona bien para mí. Ver si puede ayudar también:

<?xml version="1.0" encoding="UTF-8"?> 
    <project name="ui" basedir="." default="package"> 

    <property name="version" value="1.6"/> 
    <property name="haltonfailure" value="no"/> 

    <property name="out" value="out"/> 

    <property name="production.src" value="src"/> 
    <property name="production.lib" value="lib"/> 
    <property name="production.resources" value="config"/> 
    <property name="production.classes" value="${out}/production/${ant.project.name}"/> 

    <property name="test.src" value="test"/> 
    <property name="test.lib" value="lib"/> 
    <property name="test.resources" value="config"/> 
    <property name="test.classes" value="${out}/test/${ant.project.name}"/> 

    <property name="exploded" value="out/exploded/${ant.project.name}"/> 
    <property name="exploded.classes" value="${exploded}/WEB-INF/classes"/> 
    <property name="exploded.lib" value="${exploded}/WEB-INF/lib"/> 

    <property name="reports.out" value="${out}/reports"/> 
    <property name="junit.out" value="${reports.out}/junit"/> 
    <property name="testng.out" value="${reports.out}/testng"/> 

    <path id="production.class.path"> 
     <pathelement location="${production.classes}"/> 
     <pathelement location="${production.resources}"/> 
     <fileset dir="${production.lib}"> 
      <include name="**/*.jar"/> 
      <exclude name="**/junit*.jar"/> 
      <exclude name="**/*test*.jar"/> 
     </fileset> 
    </path> 

    <path id="test.class.path"> 
     <path refid="production.class.path"/> 
     <pathelement location="${test.classes}"/> 
     <pathelement location="${test.resources}"/> 
     <fileset dir="${test.lib}"> 
      <include name="**/junit*.jar"/> 
      <include name="**/*test*.jar"/> 
     </fileset> 
    </path> 

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

    <available file="${out}" property="outputExists"/> 

    <target name="clean" description="remove all generated artifacts" if="outputExists"> 
     <delete dir="${out}" includeEmptyDirs="true"/> 
     <delete dir="${reports.out}" includeEmptyDirs="true"/> 
    </target> 

    <target name="create" description="create the output directories" unless="outputExists"> 
     <mkdir dir="${production.classes}"/> 
     <mkdir dir="${test.classes}"/> 
     <mkdir dir="${junit.out}"/> 
     <mkdir dir="${testng.out}"/> 
     <mkdir dir="${exploded.classes}"/> 
     <mkdir dir="${exploded.lib}"/> 
     <mkdir dir="${reports.out}"/> 
    </target> 

    <target name="compile" description="compile all .java source files" depends="create"> 
     <!-- Debug output 
       <property name="production.class.path" refid="production.class.path"/> 
       <echo message="${production.class.path}"/> 
     --> 
     <javac srcdir="src" destdir="${out}/production/${ant.project.name}" debug="on" source="${version}"> 
      <classpath refid="production.class.path"/> 
      <include name="**/*.java"/> 
      <exclude name="**/*Test.java"/> 
     </javac> 
     <javac srcdir="${test.src}" destdir="${out}/test/${ant.project.name}" debug="on" source="${version}"> 
      <classpath refid="test.class.path"/> 
      <include name="**/*Test.java"/> 
     </javac> 
    </target> 

    <target name="junit-test" description="run all junit tests" depends="compile"> 
     <!-- Debug output 
       <property name="test.class.path" refid="test.class.path"/> 
       <echo message="${test.class.path}"/> 
     --> 
     <junit printsummary="yes" haltonfailure="${haltonfailure}"> 
      <classpath refid="test.class.path"/> 
      <formatter type="xml"/> 
      <batchtest fork="yes" todir="${junit.out}"> 
       <fileset dir="${test.src}"> 
        <include name="**/*Test.java"/> 
       </fileset> 
      </batchtest> 
     </junit> 
     <junitreport todir="${junit.out}"> 
      <fileset dir="${junit.out}"> 
       <include name="TEST-*.xml"/> 
      </fileset> 
      <report todir="${junit.out}" format="frames"/> 
     </junitreport> 
    </target> 

    <taskdef resource="testngtasks" classpathref="testng.class.path"/> 
    <target name="testng-test" description="run all testng tests" depends="compile"> 
     <!-- Debug output 
       <property name="test.class.path" refid="test.class.path"/> 
       <echo message="${test.class.path}"/> 
     --> 
     <testng classpathref="test.class.path" outputDir="${testng.out}" haltOnFailure="${haltonfailure}" verbose="2"> 
      <classfileset dir="${out}/test/${ant.project.name}" includes="**/*.class"/> 
     </testng> 
    </target> 

    <target name="exploded" description="create exploded deployment" depends="testng-test"> 
     <copy todir="${exploded.classes}"> 
      <fileset dir="${production.classes}"/> 
     </copy> 
     <copy todir="${exploded.lib}"> 
      <fileset dir="${production.lib}"/> 
     </copy> 
    </target> 

    <target name="package" description="create package file" depends="exploded"> 
     <jar destfile="${out}/${ant.project.name}.jar" basedir="${production.classes}" includes="**/*.class"/> 
    </target> 

</project> 
+0

No veo un objetivo Java aquí. Así que no creo que esto responda las preguntas. – Jimmy

+0

Muestra cómo establecer correctamente classpath en Ant. Fue pensado como un ejemplo que el OP podría haber usado cuando hicieron esta pregunta por primera vez hace casi seis años. Encuentre un mejor uso para su tiempo que comentarios como este. – duffymo

9

Desde el java task docs:

Cuando se utiliza el atributo frasco, todas las rutas de clases se hace caso omiso de acuerdo con Sun's specification.

Por lo tanto, el classpath que configure no se está mirando en absoluto.

Se podría añadir dist/app.jar a la ruta de clase y llamar a la clase principal directa:

<java dir ="." fork="true" classname="com.yourdomain.YourMainClass"> 
    <classpath> 
    <path refid="springlearn.classpath" /> 
    <pathelement location="dist\app.jar" /> 
    </classpath> 
</java> 

Si desea llamar a la jarra, que tendrá que configurar una entrada ruta de clase en el manifiesto cuando se construye . Eche un vistazo a la tarea pathconvert, podría ser útil.

+0

¡Gracias! Estoy comenzando tomcat vía ant y bootstrap.jar de tomcat no tiene tomcat-juli.jar en su ruta de clase Manifest. Así que traté de usar un classpath diferente. Esto no funciona si usa el "jar" attritbute. Ahora defino el nombre de clase para ejecutar y proporcionar un classpath yo mismo. ¡Gracias de nuevo! – s3b

Cuestiones relacionadas