#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.