Java.lang.NoClassDefFoundError ANT构建

9

在运行阶段,我遇到了有关类路径的错误。错误信息如下:

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

更新(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:\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.
2个回答

6

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

<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 元素内部。 - M A
我修复了。对此很抱歉!然而,相同的错误仍然存在。 - LinhSaysHi
1
@LinhSaysHi 我更新了答案。在java任务中使用jar属性时,实际上会忽略classpath。然而,仍然很奇怪它会出现那个错误。 - M A
可能是其他问题。我今天会看一下。非常感谢您花时间帮助我。 - LinhSaysHi

0

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

因此,您必须提供您需要在启动ant的过程中可用的库。

既然如此...那么您应该在哪里添加这些库呢?如果您是从eclipse启动,则可以在Window->preferences下的Ant->Runtime->Global Entries中添加它们。

如果您正在使用像jenkins这样的C.I.服务器,则可以通过多种方式添加它们,我无法直接回答,因为可能有很多种方法。

还有一种替代方案。您可以在.jar MANIFEST.MF上声明依赖项,并将其放置在该jar内部的/lib或其他位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接