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