![](/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.