2013-03-15 2 views
0

définir explicitement Donc, voici mon build.xml:pot-programme construit par Ant ne voit pas la classe avec le classpath

<?xml version="1.0"?> 
    <project name="test" default="hello_jar"> 
    <path id="commons" > 
    <fileset dir="lib"> 
     <include name="commons-lang-2.6.jar"/> 
    </fileset> 
    </path> 
    <target name="compile"> 
    <mkdir dir="build/classes"/> 
    <javac srcdir="src/test_package" destdir="build/classes" classpathref="commons"/> 
    </target> 
<target name="hello_jar" depends="compile"> 
    <mkdir dir="build/jar"/> 
    <jar destfile="build/jar/hello.jar"> 
    <fileset dir="build/classes"> 
     <include name="test_package/Hello.class"/> 
    </fileset> 
    <manifest> 
     <attribute name="Main-Class" value="test_package.Hello"/> 
    </manifest> 
    </jar> 
</target> 

Après avoir construit avec succès un pot, je l'exécute explicitement set cLASSPATH:

java -classpath lib/commons-lang-2.6.jar -jar build/jar/hello.jar test_package.Hello 

et je reçois le texte suivant:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/math/Range 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) 
    at java.lang.Class.getMethod0(Class.java:2694) 
    at java.lang.Class.getMethod(Class.java:1622) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.math.Range 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 6 more 

Pourquoi ne trouve-t-il pas le fichier 'commons-lang'?

+1

Vous ne pouvez pas spécifier '-jar' et' -cp'. –

Répondre

3

Vous devez choisir:

  • soit vous utilisez -jar, et la machine virtuelle Java utiliserez le classpath spécifié dans le fichier manifeste à l'intérieur du pot. Il utilisera également le manifeste pour savoir quelle classe principale doit être exécutée. Il ne devrait donc pas d'option -cp, et aucun nom de classe spécifié:

    java -jar build/jar/hello.jar 
    
  • ou vous utilisez -cp (ou -classpath), et vous devez ajouter chaque pot dans le classpath (communes et bonjour), et vous devez spécifier le principal nom de la classe à exécuter:

    java -cp lib/commons-lang-2.6.jar:build/jar/hello.jar test_package.Hello 
    

dans votre cas, puisque vous ne l'avez pas configuré le classpath dans le manifeste, vous devez choisir la deuxième option.

Questions connexes