Can';t在Java11中构建Selenium单机版

Can';t在Java11中构建Selenium单机版,java,selenium-webdriver,java-module,Java,Selenium Webdriver,Java Module,我正在Eclipse 2018-12中使用Java11构建Java Selenium独立应用程序,但构建失败: java.lang.module.FindException:无法为派生模块描述符 \selenium-server-standalone-3.141.59.jar 我正在研究最新版本的java中如何定义模块依赖项,因为到目前为止我只使用了版本8 module-info.java: module main { requires org.openqa.selenium.core;

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

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

我正在研究最新版本的java中如何定义模块依赖项,因为到目前为止我只使用了版本8

module-info.java:

module main {
    requires org.openqa.selenium.core;
}
主要类别:

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
java.lang.module.FindException:无法派生\selenium-server-standalone-3.141.59.jar的模块描述符
位于java.base/jdk.internal.ModulePath.readJar(ModulePath.java:647)
位于java.base/jdk.internal.module.ModulePath.readModule(ModulePath.java:330)
位于java.base/jdk.internal.ModulePath.scan(ModulePath.java:236)
位于java.base/jdk.internal.ModulePath.Scannextry(ModulePath.java:189)
位于java.base/jdk.internal.ModulePath.findAll(ModulePath.java:165)
位于java.base/java.lang.module.ModuleFinder$2.lambda$findAll$2(ModuleFinder.java:368)
位于java.lang.module.ModuleFinder$2$$Lambda$22.00000000 db437580.apply(未知源)
位于java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271)
位于java.base/java.util.AbstractList$RandomAccessSpliterator.ForEachLeving(AbstractList.java:720)
位于java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:499)
位于java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:489)
位于java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
位于java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
位于java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:241)
位于java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
位于java.base/java.lang.module.ModuleFinder$2.findAll(ModuleFinder.java:369)
位于java.base/java.lang.module.Resolver.findAll(Resolver.java:841)
位于java.base/java.lang.module.Resolver.bind(Resolver.java:223)
位于java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:304)
位于java.base/java.lang.module.ModuleDescriptor$1.resolveAndBind(ModuleDescriptor.java:2735)
位于java.base/jdk.internal.module.ModuleBotstrap.boot(moduleBotstrap.java:337)
位于java.base/java.lang.ClassLoader.initializeClassLoaders(ClassLoader.java:217)
位于java.base/java.lang.Thread.initialize(Thread.java:422)
位于java.base/java.lang.Thread(Thread.java:153)
原因:java.lang.module.InvalidModuleDescriptorException:提供程序类org.eclipse.jetty.http.http1FieldPreentCoder不在模块中
位于java.base/jdk.internal.ModulePath.deriveModuleDescriptor(ModulePath.java:554)
位于java.base/jdk.internal.ModulePath.readJar(ModulePath.java:643)
... 23多
参见此处


JavaJDK8(请注意,目前构建Selenium不支持版本9和10)。如果您的计算机上还没有该文件,请从Oracle网站下载。

这是由于.jar文件中存在错误造成的。它包含一个
META-INF/services/org.eclipse.jetty.http.httpfieldpreincoder
条目,根据,该条目必须包含实现接口
org.eclipse.jetty.http.httpfieldpreincoder
的同一.jar文件中的类名称

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

然而,在.jar中有一个
org.seleniumhq.jetty9.http.Http1FieldPreEncoder

解决此问题的最简单方法是:

  • 将整个.jar解压缩到临时目录
  • 更改
    META-INF/services/org.eclipse.jetty.http.httpfieldpreincoder
    ,使其包含一行
    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

遇到了同样的问题,在类路径中定义所有jar就可以了。

对我来说,我只需要将库中构建路径中的selenium.jar从modulepath移动到类路径。
希望能有所帮助。

谢谢你的回答,我已经安装了Java8,但我想在一个新项目中使用最新版本,以从它的改进中获益。还有更多关于堆栈跟踪的内容吗?它是否有任何“起因”部分?我通过将依赖项从modulepath移到类路径来解决它。我不确定这是否是正确的解决方案,我是否应该把它作为我问题的答案。可能没问题。通过使用类路径而不是modulepath,您告诉Java忽略模块,只需将每个.jar文件视为一个简单的归档文件。不过,我承认,我很好奇为什么Selenium.jar不能被视为一个自动模块…@VGR我用stacktrace更新了这个问题,我也很好奇。奇怪。jar(我从中获得)是一个多版本的jar,所以很明显它是为了支持Java9。当我使用jar-d-f selenium-server-standalone-3.141.59.jar--release 9时,我看不到任何服务提供商的用处。谢谢@VGR的回复!我为Selenium打开了一个bug报告,让开发人员看到您的回复。希望这是可以在上游修复的东西,这对我使用Eclipse版本2020-06和Java14是有效的。谢谢