2010-01-01 7 views
8

J'ai le fichier de construction ci-dessous pour Ant et j'essaie d'utiliser la cible 'run' pour l'exécution du programme.aide avec le fichier ant - chemin de classe pour la tâche 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> 

En utilisant la même classpathref, je suis en mesure de compiler avec succès & créer le pot, mais quand utiliser la course cible, je reçois l'erreur ci-dessous

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) 

Exception dans le thread « principal »

Toute aide est grandement appréciée. Merci

+0

où est la cible "dist"? – skaffman

Répondre

7

Voici un générique Ant build.xml qui fonctionne bien pour moi. Voir si elle peut vous aider ainsi:

<?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

Je ne vois pas de cible java ici. Donc je ne pense pas que cela réponde aux questions. – Jimmy

+0

Il montre comment définir correctement le classpath dans Ant. Il s'agissait d'un exemple que le PO aurait pu utiliser lorsqu'il a posé cette question pour la première fois il y a près de six ans. Trouver une meilleure utilisation de votre temps que des commentaires comme celui-ci. – duffymo

9

De l'java task docs:

Lorsque vous utilisez l'attribut pot, tous les paramètres de classpath sont ignorés selon Sun's specification.

Ainsi, le chemin de classe que vous avez configuré n'est pas du tout regardé.

Vous pouvez ajouter dist/app.jar à votre classpath et appeler la classe principale directe:

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

Si vous voulez appeler le pot, vous aurez besoin de mettre en place une entrée de classpath dans le manifeste lorsque vous construisez . Jetez un oeil à la tâche pathconvert, cela pourrait être utile.

+0

Merci! Je commence Tomcat via Ant et bootstrap.jar de Tomcat n'a pas Tomcat-juli.jar dans son Manifest-classpath. J'ai donc essayé d'utiliser un autre classpath. Cela ne fonctionne pas si vous utilisez le "jar" attritbute. Je définis maintenant le nom de la classe à exécuter et fournir moi-même un classpath. Merci encore! – s3b