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

时间:2017-12-14 23:09:30

标签: java maven selenium selenium-webdriver

我在我的pom.xml

中添加了最新的Selenium依赖项
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.7.1</version>
</dependency>
我跑了     mvn clean install 在我的pom.xml目录中,我还根据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。

8 个答案:

答案 0 :(得分:3)

在 Eclipse IDE 中遇到此错误。在 Eclipse 中,转到项目属性,在 Java Build Path 中,只需在 Classpath 而不是 Modulepath 中添加 selenium jar。然后在顶部的 Project 选项卡下执行 Clean 以删除早期的构建,然后执行 Run。

答案 1 :(得分:0)

  • org.openqa.seleniumselenium-api-{version}.jar文件夹下seleniumhq\selenium\selenium-api的包。
  • org.openqa.selenium.firefoxselenium-firefox-driver-{version}.jar文件夹下seleniumhq\selenium\selenium-firefox-driver的包。

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

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

答案 2 :(得分:0)

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

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

mvn clean install -U

从您的项目路径。

答案 3 :(得分: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>

答案 4 :(得分:0)

什么是 NoClassDefFoundError

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

您看到的错误是:

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 文件夹时,非常期待它。

出了什么问题:

从上述所有观点可以清楚地看出,相关的 Class Methods 是从一个来源解决的 Compile Time 期间无效的Run Time

如果通过 JDK / Maven / {存在多个来源来解析类和方法,则会出现这种情况{1}}

解决方案:

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

  • 使用构建工具时,例如 NoClassDefFoundError Maven 删除所有 Gradle External JARs 即可。 Java Build Path Maven 将下载并解决所有必需的依赖项。
  • 如果在 Gradle 中使用 Selenium JARs ,只需在 Java Project > External JARs 并删除未使用的。
  • 使用 Java Build Path 时,请使用 Maven <artifactId>selenium-java</artifactId> 。避免同时使用两者。
  • <artifactId>selenium-server</artifactId>
  • 中删除不需要的其他 <dependency>
  • 定期在IDE中清除 pom.xml ,仅用于构建具有所需依赖关系的项目。
  • 使用 Project Workspace 工具定期清除操作系统杂务。
  • 执行 CCleaner 时,请始终执行 Maven Project maven clean 然后 maven install

答案 5 :(得分:0)

我遇到过这个Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver错误。

出现此错误时,我使用“编辑配置”中的Jar在IntelijIDEA中启动了应用程序。

错误是:

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

因此,我添加的不是Jar Application-> Application: 它可以帮助我解决错误。

注意:我的依赖就像

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

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

这个问题是由于插件不合适,因为我测试了不同版本的Selenium,但对我没有帮助。

因此,当我更改maven-jar-plugin时:

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

问题消失了。 您可以找到here的插件之间的区别。


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

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


总结:

  • 如果包含所有依赖项,请尝试更改Selenium的版本;
  • 如果没有,请尝试添加必要的依赖项;
  • 尝试检查Maven文件夹是否包含特定错误;
  • 如果上面没有帮助,请尝试使用插件。