Java 12 JMeter 5 HTTP/2 请求 java.lang.NoClassDefFoundError: org/eclipse/jetty/alpn/client/ALPNClientC

Posted

技术标签:

【中文标题】Java 12 JMeter 5 HTTP/2 请求 java.lang.NoClassDefFoundError: org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory【英文标题】:Java 12 JMeter 5 HTTP/2 request java.lang.NoClassDefFoundError: org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory 【发布时间】:2019-12-27 13:08:11 【问题描述】:

我在 Ubuntu 9.0.4 上使用 Java 12、JMeter 5.1.1 并在尝试发送 HTTP/2 请求时遇到以下异常:

Response code: Non HTTP response code: java.util.concurrent.ExecutionException
Response message: Non HTTP response message: java.lang.IllegalStateException: No Client ALPNProcessors!

响应正文中的堆栈跟踪:

java.util.concurrent.ExecutionException: java.lang.IllegalStateException: No Client ALPNProcessors!
    at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:138)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Connection.connect(HTTP2Connection.java:68)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Request.setConnection(HTTP2Request.java:278)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Request.sample(HTTP2Request.java:138)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Request.sample(HTTP2Request.java:115)
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:622)
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:546)
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253)
    at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.IllegalStateException: No Client ALPNProcessors!
    at org.eclipse.jetty.alpn.client.ALPNClientConnectionFactory.<init>(ALPNClientConnectionFactory.java:54)
    at org.eclipse.jetty.http2.client.HTTP2Client.lambda$doStart$1(HTTP2Client.java:155)
    at org.eclipse.jetty.http2.client.HTTP2Client$ClientSelectorManager.newConnection(HTTP2Client.java:438)
    at org.eclipse.jetty.io.ManagedSelector.createEndPoint(ManagedSelector.java:222)
    at org.eclipse.jetty.io.ManagedSelector.access$1500(ManagedSelector.java:60)
    at org.eclipse.jetty.io.ManagedSelector$CreateEndPoint.run(ManagedSelector.java:825)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:754)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:672)
    ... 1 more

JMeter 5.1.1 默认自带jetty-alpn-client-9.4.9.v20180320.jar

然后我从 http://central.maven.org/maven2/org/eclipse/jetty/jetty-alpn-java-client/ 下载 jetty alpn java 客户端库并将其放入 jmeter 安装的 lib/ 文件夹中,并导致此异常:

java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory
    at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:138)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Connection.connect(HTTP2Connection.java:68)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Request.setConnection(HTTP2Request.java:278)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Request.sample(HTTP2Request.java:138)
    at com.blazemeter.jmeter.http2.sampler.HTTP2Request.sample(HTTP2Request.java:115)
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:622)
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:546)
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253)
    at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.NoClassDefFoundError: org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory
    at org.eclipse.jetty.http2.client.HTTP2Client.lambda$doStart$1(HTTP2Client.java:155)
    at org.eclipse.jetty.http2.client.HTTP2Client$ClientSelectorManager.newConnection(HTTP2Client.java:438)
    at org.eclipse.jetty.io.ManagedSelector.createEndPoint(ManagedSelector.java:222)
    at org.eclipse.jetty.io.ManagedSelector.access$1500(ManagedSelector.java:60)
    at org.eclipse.jetty.io.ManagedSelector$CreateEndPoint.run(ManagedSelector.java:825)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:754)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:672)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.alpn.client.ALPNClientConnectionFactory
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:436)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 8 more

我切换到 Java 11 但得到了同样的错误。 任何建议和见解都值得赞赏。

【问题讨论】:

【参考方案1】:

No Client ALPNProcessors! 是来自处理 ALPN 的 Jetty 库的消息。

因为你是在JDK 12中运行的(而且我认为和JDK 11没有什么大的区别,所以JDK 12应该没问题),你必须在classpath中有jetty-alpn-java-client jar,这样Jetty库将找到ALPNProcessor.Client 类的实现(通过ServiceLoader 机制),如错误所示,找不到该实现。

你没有详细说明你是如何设置 TLS 等的,我本来希望 JMeter 已经在类路径中有 jetty-alpn-java-client jar,但显然你的设置(或 JMeter 的)有问题。

我会仔细检查 JMeter 如何配置 TLS;如果它使用标准的 JDK 实现,那么它的类路径中必须有 jetty-alpn-java-client jar。

如果 JMeter 正在使用其他 TLS 实现(例如 Conscrypt),那么 Jetty 项目会提供类似的库(例如 jetty-alpn-conscrypt-client jar),它们同样应该在类路径中。

【讨论】:

我在安装 JMeter-5.1.1 的 lib 文件夹中有 jetty-alpn-client-9.4.9.v20180320.jarjetty-alpn-openjdk8-client-9.4.9.v20180320.jar。我错过了什么? 我没有为 TLS 做任何设置。 JMeter 在lib 文件夹中缺少jetty-alpn-java-client-9.4.9.v20180320.jar。只需添加它(您可以从central.maven.org/maven2/org/eclipse/jetty/… 下载它)。让我们知道它是否有效。【参考方案2】:

JMeter 5 doesn't officially support Java 12

JMeter 5.0 正式要求 Java 8 或 9,尽管以后的版本可能非官方兼容。根据我们的内部测试,JMeter 将在 Java 11 上运行

也在JMeter group公告中:

JMeter 5.0 在 Java 8 到 10 上进行了测试,Java 11 也应该可以工作。

还要注意 Java 12 不是 Long-Term-Support release

然而,Java SE 11 是 LTS 版本,因此即使 Java SE 12 已发布,Oracle 客户仍将收到 Oracle 标准支持和定期更新版本

【讨论】:

我切换到 Java 11 并得到同样的错误。所以这与 Java 版本无关。【参考方案3】:

解决方法:下载http://central.maven.org/maven2/org/eclipse/jetty/jetty-alpn-java-client/,放入安装好的jmeter lib/文件夹。 JMeter 只安装了jetty-alpn-client 是不够的。

【讨论】:

我们不能只将它添加到依赖项中吗?

以上是关于Java 12 JMeter 5 HTTP/2 请求 java.lang.NoClassDefFoundError: org/eclipse/jetty/alpn/client/ALPNClientC的主要内容,如果未能解决你的问题,请参考以下文章

无法在控制台模式下通过java exec命令运行JMeter 5.0

HTTP2 请求不遵循 JMeter 5.0 中的重定向

JMeter压力测试,http请求压测,5分钟让你学会如何压测接口!

jmeter配置环境变量报错,请教大神

在Eclipse编译时调用Jmeter 的包;提示java.lang.reflect.UndeclaredThrowableException

jmeter脚本编写之五类常见请求编写