Почему я получаю «Исключение в потоке»main» java.lang.NoClassDefFoundError: org/openqa / selenium /WebDriver»?

#maven #selenium-webdriver #maven-3

#maven #selenium-webdriver #maven-3

Вопрос:

Я попробовал некоторые советы, приведенные здесь по другим подобным вопросам, но не смог решить проблему. Я получаю эту ошибку при попытке выполнить jar с помощью:

 java -jar AutoHotRouter-1.0.jar
 

Учитывая следующее pom.xml — чего мне здесь не хватает??

 <?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ttt</groupId>
    <artifactId>AutoHotRouter</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>AutoHotRouter</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-api</artifactId>
            <version>2.53.1</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chrome-driver</artifactId>
            <version>2.53.1</version>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.7.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
 

Сначала я добавил:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/libs
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>com.ttt.App</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
 

Я создал jar с помощью

 mvn clean install
 

затем на

 java -jar AutoHotRouter.jar 
 

Я получил:

Исключение в потоке «main» java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver

Затем я удалил предыдущие плагины и добавил сначала maven-assembly-plugin, а поскольку у меня это не сработало, я заменил его на maven-shade-plugin:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.3.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.ttt.App</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <transformers>
                    <transformer implementation=
                                         "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.ttt.App</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
 

после

 mvn clean install 
 

и затем

 java -jar AutoHotRouter-1.0.jar
 

Я получаю:

нет основного атрибута манифеста

Я тоже пытался

 mvn clean compile assembly:single
 

с
помощью maven-assembly-plugin.

Затем я получил:

Ошибка чтения сборок: дескрипторы сборок не найдены.

Спасибо!

Ответ №1:

Это всего лишь предположение, поскольку pom пока выглядит хорошо. Немного подозрительной частью является плагин jar:

 <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.1</version>
      <configuration>
      ...
 

Похоже, что позже вы попытаетесь выполнить созданный файл jar с java -jar помощью? В этом случае все зависимости, которые вы определяете в pom, будут отсутствовать. Либо используйте плагин зависимостей для сбора файлов jar зависимостей и используйте параметр classpath при запуске jar, либо используйте плагин shade для создания uber-jar, который будет содержать ваши классы, а также зависимости.

Использование вашего pom позволило мне запустить Chrome, поэтому зависимости выглядят хорошо. Поэтому я думаю, что способ, которым вы его запускаете, вызывает это исключение.

Обновление: поскольку вы используете эту настройку для автоматизации Chrome, плагин shade кажется лучшим вариантом. Я могу запустить Chrome с этим pom и основным классом в src / main / java

 <project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>HotRouter</artifactId>
<version>1.0-SNAPSHOT</version>

<name>HotRouter</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.14.0</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>org.example.StartMain</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
 

Основной класс

 package org.example;

import org.openqa.selenium.chrome.ChromeDriver;

public class StartMain {

  public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver", "C:/Program Files/Google/Chrome/Application/chrome.exe");

    ChromeDriver driver = new ChromeDriver();
  }
}
 

Затем mvn package и java -jar ./target/HotRouter-1.0-SNAPSHOT.jar открывает chrome. Ваша конфигурация почти такая же (я думаю, что отсутствует только конфигурация фазы для плагина shade)

Важно иметь плагин shade в <plugins> разделе pom, поскольку он не является частью жизненного цикла jar по умолчанию. <pluginManagement> Раздел предназначен только для настройки значений по умолчанию для версий и конфигурации. См. Ссылку на pom. Таким образом, дополнительные плагины не будут автоматически включены, если только в этом разделе.

Комментарии:

1. Спасибо тебе @wemu. Я ДОБАВИЛ плагин shade: <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><artifactSet><excludes></excludes></artifactSet></configuration></execution></executions></plugin>. Я все еще получаю ту же ошибку. Должен ли я настроить плагин по-другому?

2. все зависит от того, как вы запускаете эту сборку. ваши зависимости от selenium не имеют области тестирования в pom.xml это было бы обычным делом. Плагин shade создан для упаковки ваших производственных источников в исполняемый файл jar. Он не будет включать в себя тестовые источники. Так что это зависит и от того, где вы разместили свои тесты (обычно src / test / maven, но это обычно не включается через плагин shade). Приводит ли сборка maven к тому же исключению? или вы на самом деле пытаетесь запустить это через исполняемый файл jar? Это также не очень часто встречается при выполнении тестов.

3. Спасибо @wemu. Обычно я использую Selenium только для автоматизации Chrome, а не для тестирования вообще. Maven (чистая установка mvn) завершается успешно. java -jar aaa.jar выдает ошибку…

4. Я добавил больше информации к этому вопросу

5. создал ли «пакет mvn» uber-jar? в целевой папке должна быть папка большего размера и «original-.jar «один. Для выполнения плагина shade также может потребоваться пакет <phase></phase> рядом с разделом целей. Вам также не нужно настраивать основной класс для jar-плагина, поскольку плагин shade сделает это для uber-jar.