无法在Java 11中独立构建Selenium
我正在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;
}
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
回答:
这是由于.jar文件中的错误。它包含一个META-
INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder条目,根据jar服务提供商接口规范,该条目必须在实现该接口的同一.jar文件中包含一个类的名称org.eclipse.jetty.http.HttpFieldPreEncoder
。
但是,作为例外情况,该服务描述符文件包含org.eclipse.jetty.http.Http1FieldPreEncoder
.jar文件中不存在的类。
但是,org.seleniumhq.jetty9.http.Http1FieldPreEncoder
.jar中有一个类。
解决此问题的最简单方法是:
- 将整个.jar提取到一个临时目录。
- 进行更改
META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder
,使其包含单行org.seleniumhq.jetty9.http.Http1FieldPreEncoder
。 - 从更改的内容创建一个新的.jar文件。
如果您不在Windows中,则可以在命令行上执行此操作:
mkdir -p META-INF/servicesecho 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 的全部内容, 来源链接: utcz.com/qa/413358.html