2009-12-22 7 views
3

J'ai un tas de fichiers .java dans un dossier "src" qui dépendent de trois jars dans un dossier "lib". Je le fichier build.xml suivant:Comment inclure plusieurs jars dans le classpath en utilisant ant?

<?xml version="1.0"?> 
<project name="MyProj" basedir="."> 
<property name="src" value="src"/> 
<property name="build" value="build"/> 
<property name="lib" value="lib"/> 


<path id="master-classpath"> 
    <fileset dir="${lib}"> 
    <include name="activemq-all-5.1-SNAPSHOT.jar"/> 
    <include name="geronimo-jms_1.1_spec-1.1.1.jar"/> 
    <include name="activemq-core-5.3.0.jar"/> 
    </fileset> 
</path> 

<javac destdir="${build}"> 
    <src path="${src}"/> 
    <classpath refid="master-classpath"/> 
</javac> 

</project> 

Cette compile très bien, mais quand je tente de course je me

"java.lang.NoClassDefFoundError: javax/jms/Destination"

Ce programme fonctionne et compile très bien quand j'inclut les pots dans le Buildpath en utilisant Eclipse, cependant.

EDIT: J'ai donc copié les fichiers JAR dans le dossier contenant les classes compilées. La classe avec la méthode principale est NDriver.class. Lorsque je tente:

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar NDriver

Cela donne:

Exception in thread "main" java.lang.NoClassDefFoundError: NDriver

Je vous remercie de toute aide.

Répondre

3

Vous devez placer les jars utilisés au moment de la compilation sur le chemin de classe lorsque exécutant l'application. Malheureusement, vous n'avez pas fourni de détails sur la façon dont vous le dirigez, il est donc difficile de vous donner plus de conseils.

MISE À JOUR: Le répertoire contenant les classes compilées doit également être ajouté au classpath. Si vous lancez java à partir du répertoire contenant les classes compilées, vous pouvez utiliser . pour désigner le répertoire en cours. Ajouter à la classpath comme indiqué ci-dessous pour dire java de chercher des cours là-bas aussi (je l'ai ajouté . juste après activemq-all-5.1-SNAPSHOT.jar):

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar:. NDriver 
+1

Si vous utilisez Java 6 et si les fichiers jars sont tous dans le même répertoire, vous pouvez également utiliser un caractère générique. Quelque chose comme: java -cp ./* :. NDriver –

2

Une façon (légèrement différentes variables que le vôtre)

<path id="classpath"> 
    <fileset dir="${lib.dir}" includes="**/*.jar"/> 
</path> 

<manifestclasspath property="manifest.classpath" jarfile="${jarfile}"> 
    <classpath refid="classpath"/> 
</manifestclasspath> 

<target name="jar" depends="compile" description="create the jar"> 
    <jar destfile="${jarfile}" basedir="${build.dir}"> 
     <manifest> 
      <attribute name="Manifest-Version" value="${manifest-version}"/> 
      <attribute name="Created-By" value="${ant.java.version}"/> 
      <attribute name="Main-Class" value="${main-class}"/> 
      <attribute name="Class-Path" value="${manifest.classpath}"/> 
     </manifest> 
    </jar> 
</target> 

Bien sûr, ici je suppose que vous créez un pot et l'exécuter (y compris le classpath là-bas). Une autre option serait d'avoir une cible run qui utilise la balise <java> et d'utiliser explicitement le classpath ici.

0

De mon expérience, il semble Eclipse comprendra souvent des classes et des pots dans le classpath sans utiliser explicitement la déclaration classpath. En effet, il peut parfois être assez difficile de supprimer des classes de la construction d'Eclipse (elles doivent être effacées ou nettoyées).

1

Les fichiers de bibliothèque sont-ils inclus dans le chemin de classe lorsque vous exécutez le programme? Eclipse les ajoute automatiquement, mais vous devez les spécifier lorsque vous exécutez le programme à partir de la ligne de commande.

Questions connexes