Невозможно построить Selenium отдельно в Java 11 - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю автономное приложение Java Selenium с использованием Java11 в Eclipse 2018-12, но мои сборки терпят неудачу:

java.lang.module.FindException: Невозможно получить дескриптор модуля для \ selenium-server-standalone-3.141.59.jar

Я изучал, как определяются зависимости модулей в последней версии Java, так как я до сих пор использовал только версию 8.

module-info.java:

module main {
    requires org.openqa.selenium.core;
}

mainClass:

package main;

import org.openqa.selenium.WebDriver;

public class DownloadDocuments {

    public static void main(String[] args) {
        System.out.println("hello!");
        WebDriver driver;
    }

}

Есть ли какие-либо дополнительные настройки, необходимые для работы с модулями?

Отслеживание стека

java.lang.module.FindException: Unable to derive module descriptor for \selenium-server-standalone-3.141.59.jar
    at java.base/jdk.internal.module.ModulePath.readJar(ModulePath.java:647)
    at java.base/jdk.internal.module.ModulePath.readModule(ModulePath.java:330)
    at java.base/jdk.internal.module.ModulePath.scan(ModulePath.java:236)
    at java.base/jdk.internal.module.ModulePath.scanNextEntry(ModulePath.java:189)
    at java.base/jdk.internal.module.ModulePath.findAll(ModulePath.java:165)
    at java.base/java.lang.module.ModuleFinder$2.lambda$findAll$2(ModuleFinder.java:368)
    at java.lang.module.ModuleFinder$2$$Lambda$22.00000000DB437580.apply(Unknown Source)
    at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271)
    at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:489)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:241)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at java.base/java.lang.module.ModuleFinder$2.findAll(ModuleFinder.java:369)
    at java.base/java.lang.module.Resolver.findAll(Resolver.java:841)
    at java.base/java.lang.module.Resolver.bind(Resolver.java:223)
    at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:304)
    at java.base/java.lang.module.ModuleDescriptor$1.resolveAndBind(ModuleDescriptor.java:2735)
    at java.base/jdk.internal.module.ModuleBootstrap.boot(ModuleBootstrap.java:337)
    at java.base/java.lang.ClassLoader.initializeClassLoaders(ClassLoader.java:217)
    at java.base/java.lang.Thread.initialize(Thread.java:422)
    at java.base/java.lang.Thread.<init>(Thread.java:153)
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class org.eclipse.jetty.http.Http1FieldPreEncoder not in module
    at java.base/jdk.internal.module.ModulePath.deriveModuleDescriptor(ModulePath.java:554)
    at java.base/jdk.internal.module.ModulePath.readJar(ModulePath.java:643)
    ... 23 more

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

Это связано с ошибкой в ​​файле .jar.Он содержит запись META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder, которая, согласно спецификации интерфейса поставщика услуг jar , должна содержать имя класса в том же файле .jar, который реализует интерфейс org.eclipse.jetty.http.HttpFieldPreEncoder.

Но, как говорится в исключении, этот файл дескриптора службы содержит org.eclipse.jetty.http.Http1FieldPreEncoder, класс, которого нет в файле .jar.

Однако в .jar есть класс org.seleniumhq.jetty9.http.Http1FieldPreEncoder..

Самый простой способ исправить это:

  • Извлечь весь .jar во временный каталог.
  • Изменить META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder, чтобы он содержал одну строкуorg.seleniumhq.jetty9.http.Http1FieldPreEncoder.
  • Создать новый файл .jar из измененного содержимого.

Если вы не в Windows, вы можете сделать это в командной строке:

mkdir -p META-INF/services
echo org.seleniumhq.jetty9.http.Http1FieldPreEncoder > META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder
zip -u -m selenium-server-standalone-3.141.59.jar META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder
rm -r META-INF
0 голосов
/ 11 июня 2019

Обнаружена та же проблема, определение всех банок в пути к классам послужит цели.

0 голосов
/ 27 декабря 2018

см. Здесь https://github.com/SeleniumHQ/selenium/wiki/Building-WebDriver

Java JDK 8 (обратите внимание, что версии 9 и 10 в настоящее время не поддерживаются для сборки Selenium).Загрузите его с сайта Oracle, если его еще нет на вашем компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...