2015-08-20 11 views
9

Ich erhalte einen Fehler in Bezug auf den Klassenpfad in der Run-Phase. Der Fehler istjava.lang.NoClassDefFoundError ANT Build

run: 
    [java] java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver 
    [java] at java.lang.Class.getDeclaredMethods0(Native Method) 
    [java] at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
    [java] at java.lang.Class.privateGetMethodRecursive(Unknown Source) 
    [java] at java.lang.Class.getMethod0(Unknown Source) 
    [java] at java.lang.Class.getMethod(Unknown Source) 
    [java] at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) 
    [java] at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
    [java] Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.WebDriver 
    [java] at java.net.URLClassLoader.findClass(Unknown Source) 
    [java] at java.lang.ClassLoader.loadClass(Unknown Source) 
    [java] at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    [java] at java.lang.ClassLoader.loadClass(Unknown Source) 
    [java] ... 7 more 
    [java] Error: A JNI error has occurred, please check your installation and try again 
    [java] Exception in thread "main" 
    [java] Java Result: 1 
BUILD SUCCESSFUL 
Total time: 1 second 

Dies ist der XML-Buildcode, den ich geschrieben habe. Ich verweise auf den RunningPower-JAR-Ordner und glaube, dass auf den richtigen Ordner verwiesen wird, da ich kompilieren kann. Mein Basisverzeichnis enthält auch eine .classpath- und .project-Datei, aber nicht sicher, ob sie wichtig sind.

<?xml version="1.0" ?> 

<project name="SeleniumProjectDataDriven" basedir="." default="run"> 
    <target name="init"> 
     <property name="src.dir" value="src" /> 
     <property name="build.dir" value="build" /> 
     <property name="classes.dir" value="${build.dir}/class" /> 
     <property name="lib.dir" value="RunningPowerJars" /> 
    </target> 

    <target name="clean" depends="init"> 
     <delete dir="build"/> 
    </target> 

    <target name="compile" description="Compiles the code" depends="clean" > 
     <mkdir dir="${classes.dir}" /> 
     <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false"> 
      <classpath> 
       <fileset dir="${lib.dir}"> 
        <include name="**/*.jar" /> 
       </fileset> 
      </classpath> 
     </javac> 
    </target> 

    <target name="jar" description="Packages the code into jar" depends="compile"> 
     <mkdir dir="build/jar"/> 
      <jar destfile="build/jar/RunningPower.jar" basedir="build/class"> 
       <manifest> 
        <attribute name="Main-Class" value="RunningPower"/> 
       </manifest> 
      </jar> 
    </target> 

    <target name="run" description="Run the jar file" depends="jar" > 
     <java jar="build/jar/RunningPower.jar" fork="true"/> 
    </target> 
</project> 

In meinem RunningPowerJars Ordner enthalten sie

junit-4.8.1.jar 
ojdbc6.jar 
poi-3.7-20101029.jar 
selenium-java-2.46.0.jar 
selenium-server-standalone-2.46.0.jar 
testng-6.1.1.jar 

Update (07.32 PST 8/21/2015)

<target name="run" description="Run the jar file" depends="jar" > 
    <java jar="build/jar/RunningPower.jar" fork="true"> 
     <classpath> 
      <fileset dir="${lib.dir}"> 
      <include name="**/*.jar" /> 
      </fileset> 
     </classpath> 
    </java> 
</target> 

ich den Code geändert, lief aber in einen anderen Fehler .

Antwort

6

Der Klassenpfad wird auch beim Ausführen der Jar-Datei benötigt, damit die JVM Bibliotheksklassen finden kann. Wenn Sie jedoch das jar-Attribut in der java-Task verwenden, werden "alle Klassenpfadeinstellungen ignoriert" (siehe https://ant.apache.org/manual/Tasks/java.html). Der einfachste Weg ist die Hauptklasse angeben und die kompilierte Jar zusammen mit dem Bibliotheks Jars im RunningPowerJars Verzeichnis hinzufügen:

<target name="run" description="Run the jar file" depends="jar" > 
    <java classname="RunningPower" fork="true"> 
     <classpath> 
      <pathelement location="build/jar/RunningPower.jar"/> 
      <fileset dir="${lib.dir}"> 
       <include name="**/*.jar" /> 
      </fileset> 
     </classpath> 
    </java> 
</target> 

Ein unabhängiger Hinweis ist, dass Sie die Eigenschaften in init im gesamten Buildfile definiert nutzen könnten. Beispielsweise können Sie in dem jar Ziel ${classes.dir} anstelle von build/class wiederholen.

Es ist noch nicht sinnvoll, warum die Build fehlschlagen würde, wenn das classpath Element innerhalb der java Aufgabe hinzugefügt wird, wenn mit dem jar Attribute. Obwohl es ignoriert wird, ist es seltsam, dass es mit dem Fehler "Fehler beim Erstellen einer Aufgabe oder eines Typs" fehlschlägt.

+1

@LinhSaysHi Sie haben die Aktualisierung nicht korrekt durchgeführt. Der 'classpath' sollte _inside_ das' java' Element sein. – manouti

+0

Ich habe es behoben. Das tut mir leid! Allerdings tritt immer noch der gleiche Fehler auf – LinhSaysHi

+1

@LinhSaysHi Ich aktualisierte die Antwort. 'classpath' wird tatsächlich ignoriert, wenn das' jar' Attribut in der 'java' Task verwendet wird. Trotzdem ist es seltsam, dass es mit diesem Fehler nicht funktioniert. – manouti

0

Beachten Sie, dass wenn Sie den Parameter -jar mit der java.exe in der Befehlszeile verwenden, der Klassenpfadparameter ignoriert wird, was auch mit der Java-Task in ant passiert.

Also, was Sie tun müssen, ist, die Bibliotheken zur Verfügung zu stellen, die Sie benötigen, um den Prozess zu haben, der diese Ameise startet, und das wird ausreichen.

Einmal gesagt, dass ... wo sollten Sie diese Bibliotheken dann hinzufügen? Wenn Sie von Eclipse aus starten, können Sie sie unter Windows-> Einstellungen unter Ant-> Runtime-> Globale Einträge hinzufügen.

Wenn Sie einige C.I. server wie jenkins könnte man sie auf viele verschiedene weise hinzufügen, ich kann keine direkte antwort geben, weil es viele geben könnte.

Es gibt auch eine Alternative. Sie können die Abhängigkeit von der .jar MANIFEST.MF deklarieren und sie unter/lib oder was auch immer in diesem jar ablegen.

Verwandte Themen