无法在Java 11中独立构建Selenium [英] Can't build Selenium standalone in java 11

查看:272
本文介绍了无法在Java 11中独立构建Selenium的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Eclipse 2018-12中使用Java11构建Java Selenium独立应用程序,但构建失败:

I am building a Java Selenium standalone application using Java11 in Eclipse 2018-12 but my builds fail:

java.lang.module.FindException:无法导出模块描述符 \ selenium-server-standalone-3.141.59.jar

java.lang.module.FindException: Unable to derive module descriptor for \selenium-server-standalone-3.141.59.jar

由于我到目前为止仅使用版本8,所以我一直在研究如何在最新版本的java中定义模块依赖项.

I was looking into how module dependencies are defined in the latest version of java as I have been using only version 8 so far.

module-info.java:

module-info.java:

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

mainClass:

mainClass:

package main;

import org.openqa.selenium.WebDriver;

public class DownloadDocuments {

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

}

使用模块时是否还需要其他配置步骤?

Are there any additional configurations steps needed when working with modules?

堆栈跟踪

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

推荐答案

这是由于.jar文件中的错误所致.它包含一个META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder条目,根据

This is due to a mistake in the .jar file. It contains a META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder entry, which, according to the jar service provider interface specification, must contain the name of a class in the same .jar file which implements the interface org.eclipse.jetty.http.HttpFieldPreEncoder.

但是,作为例外情况,该服务描述符文件包含org.eclipse.jetty.http.Http1FieldPreEncoder,这是.jar文件中不存在的类.

But, as the exception states, that service descriptor file contains org.eclipse.jetty.http.Http1FieldPreEncoder, a class which does not exist in the .jar file.

但是,.jar中有一个org.seleniumhq.jetty9.http.Http1FieldPreEncoder类.

There is, however, a org.seleniumhq.jetty9.http.Http1FieldPreEncoder class in the .jar.

最简单的解决方法是:

  • 将整个.jar提取到一个临时目录中.
  • 更改META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder,使其包含单行org.seleniumhq.jetty9.http.Http1FieldPreEncoder.
  • 根据更改后的内容创建一个新的.jar文件.
  • Extract the entire .jar to a temporary directory.
  • Change META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder so it contains the single line org.seleniumhq.jetty9.http.Http1FieldPreEncoder.
  • Create a new .jar file from the changed content.

如果您不在Windows中,则可以在命令行上进行:

If you’re not in Windows, you can do it on the command line:

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

这篇关于无法在Java 11中独立构建Selenium的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆