2015-08-20 123 views
9

我在运行阶段遇到类路径错误。错误是java.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 

这是我写的xml构建代码。我引用RunningPower jars文件夹,我相信正确的文件夹被引用,因为我能够编译。我的基本目录还包含一个.classpath和.project文件,但不知道它们是否重要。

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

在我RunningPowerJars文件夹,它们包含

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 

更新(上午07时32分PST 2015年8月21日)

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

我修改了代码,但遇到了另一个错误。

BUILD FAILED 
C:\Users\dt208672\Perforce\depot\ebill\Automation\Selenium_eBill\RunningPower\build.xml:37: Problem: failed to create task or type classpath 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

回答

6

运行Jar文件时还需要classpath,以便JVM可以找到库类。但是,在java任务中使用jar属性时,“所有类路径设置都将被忽略”(请参阅https://ant.apache.org/manual/Tasks/java.html)。最简单的方法是指定主类,并添加编译罐与位于RunningPowerJars目录库罐一起:

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

一个不相关的注意的是,你可以使用在整个构建文件中init定义的属性。例如,在jar目标中,您可以使用${classes.dir}而不是重复build/class

如果在使用jar属性时在java任务内添加classpath元素,构建将失败的原因仍然没有意义。虽然它被忽略了,但奇怪的是由于“未能创建任务或类型”错误而失败。

+1

@LinhSaysHi您没有正确更新。 'classpath'应该在'java'元素的内部。 – manouti

+0

我修好了。对于那个很抱歉!但同样的错误仍然存​​在 – LinhSaysHi

+1

@LinhSaysHi我更新了答案。在'java'任务中使用'jar'属性时''classpath'实际上被忽略了。然而,它很奇怪,它会因为这个错误而失败。 – manouti

0

请注意,当您在命令行中使用java.exe使用-jar参数时,classpath参数将被忽略,这也会发生在ant中的java任务中。

所以,你必须做的是提供你需要的库,以便启动该蚂蚁的进程可用。

曾经说过......应该在哪里添加这些库?如果你从eclipse启动,你可以将它们添加到Ant-> Runtime-> Global Entries下的Window-> Preferences中。

如果你正在使用一些C.I.像詹金斯这样的服务器,你可以用多种方式添加它们,但我不能直接给出答案,因为可能有很多。

还有一个选择。您可以声明对.jar MANIFEST.MF的依赖关系,并将其放在/ lib或任何内部的jar中。