我在运行阶段得到一个关于类路径的错误。错误是
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 jar文件夹,我相信正确的文件夹被引用,因为我能够编译。我的基本目录还包含。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
更新(太平洋标准时间2015年8月21日上午7:32)
<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:Usersdt208672PerforcedepotebillAutomationSelenium_eBillRunningPowerbuild.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.
在运行Jar文件时也需要类路径,以便JVM可以找到库类。但是,当在java
任务中使用jar
属性时,"忽略所有类路径设置"(参见https://ant.apache.org/manual/Tasks/java.html)。最简单的方法是指定主类并将编译后的Jar与位于RunningPowerJars
目录中的库Jar一起添加:
<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
属性时将classpath
元素添加到java
任务中,为什么构建会失败,这仍然没有意义。虽然它被忽略了,但奇怪的是它失败了,错误是"failed to create task or type"。
考虑当您在命令行中使用java.exe使用-jar参数时,classpath参数将被忽略,ant中的java任务也会发生这种情况。
因此,您必须做的是提供您需要的库,以便启动该ant的进程可用,这就足够了。
曾经说过……那么应该在哪里添加这些库呢?如果从eclipse启动,可以在Window->preferences下的Ant->Runtime->Global Entries中添加它们。
如果你使用的是像jenkins这样的cgi服务器,你可以通过多种方式添加它们,我无法给出一个直接的答案,因为可能有很多。
还有另一种选择。您可以在.jar MANIFEST中声明依赖项。然后放到/lib或者其他文件夹下