无法在Java 11中独立构建Selenium [英] Can't build Selenium standalone in java 11
问题描述
我正在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 lineorg.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屋!