繁体   English   中英

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

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

我在我的 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 文档在我的应用程序 class 中导入了正确的类

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 存储库中不存在。 我很困惑,我只想在我的本地存储库中成功导入 selenium Webdriver。

首先,正确检查您的程序是否具有所有重要的依赖项。
其次,我在运行 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>

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


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

Java 构建工具和 IDE 还可以生成依赖关系报告,告诉您哪些库依赖于该 JAR。 大多数情况下,识别和升级依赖于旧 JAR 的库可以解决问题。


总结一下:

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

NoClassDefFoundError

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

您看到的错误是:

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

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

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

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

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


什么地方出了错 :

从上述所有观点来看,很明显相关的方法是从一个源Compile Time解决的,而该源在Run Time期间不可用。

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


解决方案 :

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

  • 在使用构建工具(例如MavenGradle )时,从Java 构建路径中删除所有外部 JAR MavenGradle将下载并解析所有必需的依赖项。
  • 如果在Java 项目中使用Selenium JAR ,则仅在Java 构建路径中添加所需的外部 JAR ,并删除未使用的 JAR。
  • 使用Maven时,请使用<artifactId>selenium-java</artifactId><artifactId>selenium-server</artifactId> 避免同时使用两者。
  • pom.xml中删除不需要的其他<dependency>
  • 定期清理 IDE 中的Project Workspac ,仅用于构建具有所需依赖项的项目。
  • 使用CCleane工具定期清除操作系统的琐事。
  • 当您执行Maven 项目时,请始终执行maven cleanmaven installmaven test

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

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

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

mvn clean install -U

从您的项目路径。

发生这种情况是因为您在模块路径下选择 jar 文件,您应该将它们添加到类路径下。

  • org.openqa.seleniumseleniumhq\selenium\selenium-api文件夹下selenium-api-{version}.jar中的包。
  • org.openqa.selenium.firefoxseleniumhq\selenium\selenium-firefox-driver文件夹下selenium-firefox-driver-{version}.jar中的包。

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

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

你只有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>

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

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

从过去的 2 天开始,我遇到了以下错误,帮助我的是删除所有 selenium 额外依赖项,如 selenium-support、selenium-chrome-driver 等,并仅将以下依赖项保留在 POM 文件中。

错误:-

java.lang.NoClassDefFoundError: org/openqa/selenium/HasAuthentication

at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)

删除所有其他文件后的 pom 文件中的依赖项:-

<dependencies>
    <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>4.1.1</version>
            </dependency>
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>7.4.0</version>
                <scope>test</scope>
            </dependency>
    </dependencies>

在 Eclipse IDE 中运行 selenium 测试时遇到了这个问题。

导航到以下路径:

1.属性>>Java构建路径>>库。

2.在Classpath而不是Modulepath中添加所有selenium jars。

3.应用并关闭模态。

4.现在转到构建路径并单击“配置构建路径”。

5.现在运行硒测试。

Para resolver este questiona, abrí las propiedades del proyecto, navegué hasta la Caribbean"Java Build Path /Libraries"。 Luego eliminé todas las librerías de selenium de la instancia "Modulepath" y las agregué nuevamente en la instancia "Classpath"。 Seguidamente refresqué el proyecto y al hacer "Run" funcionó la llamada del navegador。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM