![](/img/trans.png)
[英]I am getting an "exception in thread "main" 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>
问题消失了。 您可以在此处找到插件之间的区别。
此外,有时我们甚至使用相同的方法名称来升级我们的库。 由于版本不同,当一个库与此类升级不兼容时,我们会在运行时收到NoClassDefFoundError或NoSuchMethodError 。
Java 构建工具和 IDE 还可以生成依赖关系报告,告诉您哪些库依赖于该 JAR。 大多数情况下,识别和升级依赖于旧 JAR 的库可以解决问题。
总结一下:
当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.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的几个步骤:
<artifactId>selenium-java</artifactId>
或<artifactId>selenium-server</artifactId>
。 避免同时使用两者。pom.xml
中删除不需要的其他<dependency>
maven clean
、 maven install
和maven 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.selenium
是seleniumhq\selenium\selenium-api
文件夹下selenium-api-{version}.jar
中的包。org.openqa.selenium.firefox
是seleniumhq\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.