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

问题描述 投票:4回答:5

我在我的pom.xml中添加了最新的Selenium依赖项

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

我使用我的pom.xml在目录中运行了mvn clean install,我还根据Selenium文档在我的app类中导入了正确的类

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

但是当我尝试运行我的main方法时,我收到以下错误

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

我查看我的〜/ .m2 / repository文件夹,我没有看到openqa文件夹,但我看到了seleniumhq文件夹。

为什么没有maven安装openqa文件夹,为什么文档说要从org.openqa导入...当我的jar存储库中从不存在。我很困惑,我只是希望能够在我的本地存储库中成功导入selenium Webdriver。

java maven selenium selenium-webdriver
5个回答
0
投票
  • org.openqa.selenium是在selenium-api-{version}.jar文件夹下的seleniumhq\selenium\selenium-api中的包。
  • org.openqa.selenium.firefox是在selenium-firefox-driver-{version}.jar文件夹下的seleniumhq\selenium\selenium-firefox-driver中的包。

所以没有openqa文件夹,它只是seleniumhq文件夹下的包名,你应该检查一下这些jar。

没有项目结构和代码细节,很难说是什么导致了NoClassDefFoundError异常。例外情况与ClassNotFoundException不同。也许这个答案https://stackoverflow.com/a/5756989/5374508会有所帮助。


0
投票

您使用的是IDE还是在命令行中工作?例如,在Eclipse中,您可以通过右键单击项目,转到Maven菜单项然后选择“更新项目”来强制下载所有依赖项。然后选中“强制更新快照/版本”复选框。

如果从命令行打开,请执行以下操作:

mvn clean install -U

从您的项目路径。


0
投票

你只有selenium-java依赖。要使用完整功能,您需要导入所有selenium依赖项

    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-chrome-driver -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>${selenium.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>${selenium.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>${selenium.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-firefox-driver -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-firefox-driver</artifactId>
        <version>${selenium.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-api</artifactId>
        <version>${selenium.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-remote-driver -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-remote-driver</artifactId>
        <version>${selenium.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-support -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-support</artifactId>
        <version>${selenium.version}</version>
    </dependency>

0
投票

什么是NoClassDefFoundError

NoClassDefFoundError无法在运行时找到特定的类(在编译时可用)时,就会发生Java中的Java Virtual Machine。例如,如果我们已经从类中解析了一个方法调用或者访问了类的任何静态成员,并且该类在运行时不可用,那么JVM将抛出NoClassDefFoundError

您看到的错误是:

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

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

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

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

所以,当你看到一个seleniumhq文件夹时,它是非常期待的。

什么地方出了错 :

从上面提到的所有观点来看,显然相关的ClassMethods是从Compile Time期间无法获得的Run Time源解析的。

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

方案:

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

  • 使用构建工具时,例如MavenGradle,从External JARs删除所有Java Build PathMavenGradle将下载并解决所有必需的依赖项。
  • 如果在Selenium JARs中使用Java Project,只需在External JARs中添加所需的Java Build Path并删除未使用的Maven
  • 使用<artifactId>selenium-java</artifactId>时,要么使用<artifactId>selenium-server</artifactId>,要么使用<dependency>。避免同时使用两者。
  • pom.xml删除不需要的其他Project Workspace
  • 定期在IDE中清理CCleaner,以构建具有所需依赖项的项目。
  • 使用Maven Project工具定期擦除OS杂务。
  • 当你执行maven clean总是做maven installmaven test然后Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver

0
投票

我有这个Jar错误的经验。

当我收到此错误时,我使用编辑配置中的Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver at project.Main.main(Main.java:45) Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.WebDriver at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more 在Intellij IDEA中启动我的应用程序。

错误是:

Jar Application

所以,我添加而不是Application - > <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.53.1</version> </dependency> :它帮助我解决错误。

注意:我的依赖是这样的

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>25.0-jre</version>
    </dependency>

总结它和推荐作为解决方案:我认为这个错误是由于几个库的冲突依赖性而出现的。因此,您需要升级POM中的所有内容,删除/注释不必要的依赖项,最后重建工件并正确地重新创建jar。

还尝试更改Selenium的版本,因为较旧的版本可能与较新的其他库冲突。


0
投票

对我有用的是将此依赖项添加到pom.xml:

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.