当前位置: 首页 > 知识库问答 >
问题:

线程“main”java中出现异常。lang.NoClassDefFoundError:org/openqa/selenium/WebDriver

子车劲
2023-03-14

我已经在我的pom.xml中添加了最新的硒依赖项

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.7.1</version>
</dependency>

我用pom在目录中运行了mvn clean install。xml和我还根据Selenium文档在我的应用程序类中导入了正确的类

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

然而,当我尝试运行我的主方法时,我得到以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: 
org/openqa/selenium/WebDriver

我在我的~/. m2/repository文件夹中查看,我没有看到openqa文件夹,而是看到了seleniumhq文件夹。

为什么maven没有安装openqa文件夹,为什么留档说要从org.openqa.导入...当它从来没有存在于我的jar存储库中时。我很困惑,我只想能够在本地存储库中成功导入硒网络驱动程序。

共有3个答案

长孙鸿振
2023-03-14

当Java虚拟机无法在运行时找到编译时可用的特定类时,Java中会发生NoClassDefFoundError。例如,如果我们解析了一个类的方法调用或访问了一个类的任何静态成员,而该类在运行时不可用,那么JVM将抛出NoClassDefFoundError

您看到的错误是:

Exception in thread "main" java.lang.NoClassDefFoundError: 
org/openqa/selenium/WebDriver

这清楚地表明,Selenium正试图在运行时从org/openqa/selenium/WebDriver解析特定的类,该类不再可用。

正如你提到的查看~/。m2/repository文件夹,Selenium v3的maven文件夹结构。7.1(在Windows上)如下所示:

C:\Users\<user_name>\.m2\repository\org\seleniumhq\selenium\selenium-java\3.7.1

因此,当您看到一个seleniumhq文件夹时,它几乎是意料之中的。

从上面提到的所有点可以清楚地看出,相关的类或方法是从一个源编译时解决的,而编译时在运行时是不可用的。

如果存在多个源来通过JDK/Maven/Gradle解析类和方法,则会发生这种情况。

以下是解决NoClassDefFoundError的几个步骤:

  • 在使用构建工具(如Maven或Gradle)时,从Java构建路径中移除所有外部JAR。Maven或Gradle将下载并解决所有必需的依赖项
壤驷骁
2023-03-14

在Eclipse IDE中遇到此错误。在Eclipse中转到项目属性,在Java构建路径中只需在类路径中添加硒罐而不是模块路径。然后在顶部的项目选项卡下执行清洁以删除早期的buiid,然后执行运行。

劳烨
2023-03-14

首先,正确地检查你的程序是否有所有重要的依赖项
其次,我在运行maven project时也遇到了类似的错误:

Caused by: java.lang.NoClassDefFoundError: org/openqa/selenium/JavascriptExecutor

这个问题是因为不合适的插件,因为我测试了不同版本的硒,它没有帮助我。

所以当我改变maven jar插件时:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
 <configuration>
   <archive>
        <manifest>
             <addClasspath>true</addClasspath>
             <classpathPrefix>lib/</classpathPrefix>
             <mainClass>your_main_class</mainClass>
        </manifest>
   </archive>
 </configuration>
</plugin>

maven shade插件plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
       <execution>
            <phase>package</phase>
            <goals>
               <goal>shade</goal>
            </goals>
            <configuration>
                 <transformers>
                    <transformer 
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>your_main_class</mainClass>
                    </transformer>
                 </transformers>
             </configuration>
       </execution>
    </executions>
</plugin>

问题已经解决了。你可以在这里找到插件之间的区别。

此外,有时我们甚至用相同的方法名升级我们的库。由于版本不同,当一个库与此类升级不兼容时,我们会在运行时得到NoClassDefFoundError或NoSuchMethodError。

Java构建工具和IDE还可以生成依赖性报告,告诉您哪些库依赖于该JAR。通常,识别和升级依赖于旧JAR的库可以解决这个问题。

总结:

  • 尝试更改Selenium的版本,如果它包含所有依赖项
  • 如果你没有必要的依赖,试着添加它
  • 试着检查maven的文件夹是否有具体错误
  • 如果上面没有任何帮助,尝试使用插件
 类似资料: