Java ClassNotFoundException:org/eclipse/jetty/alpn/alpn,但我可以访问这个类

Java ClassNotFoundException:org/eclipse/jetty/alpn/alpn,但我可以访问这个类,java,eclipse,jetty,classnotfoundexception,alpn,Java,Eclipse,Jetty,Classnotfoundexception,Alpn,我有这样的代码: public static void main(String[] args) throws Exception { System.out.println("ALPN class: " + ALPN.class); HelloWorldClient client = new HelloWorldClient("localhost", 10009); } 这就产生了这样的输出: ALPN class: class org.eclipse.jetty.alpn.AL

我有这样的代码:

public static void main(String[] args) throws Exception {
    System.out.println("ALPN class: " + ALPN.class);
    HelloWorldClient client = new HelloWorldClient("localhost", 10009);
}
这就产生了这样的输出:

ALPN class: class org.eclipse.jetty.alpn.ALPN
Exception in thread "main" java.lang.IllegalArgumentException: ALPN is not configured properly. See https://github.com/grpc/grpc-java/blob/master/SECURITY.md#troubleshooting for more information.
    at io.grpc.netty.GrpcSslContexts.selectApplicationProtocolConfig(GrpcSslContexts.java:163)
    at io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:136)
    at io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:124)
    at io.grpc.netty.GrpcSslContexts.forClient(GrpcSslContexts.java:94)
    at btcduke.node.ln.HelloWorldClient.<init>(HelloWorldClient.java:35)
    at btcduke.node.ln.HelloWorldClient.main(HelloWorldClient.java:76)
Caused by: java.lang.ClassNotFoundException: org/eclipse/jetty/alpn/ALPN
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at io.grpc.netty.JettyTlsUtil.isJettyAlpnConfigured(JettyTlsUtil.java:34)
    at io.grpc.netty.GrpcSslContexts.selectApplicationProtocolConfig(GrpcSslContexts.java:153)
    ... 5 more
ALPN类:类org.eclipse.jetty.ALPN.ALPN
线程“main”java.lang.IllegalArgumentException中出现异常:ALPN配置不正确。看见https://github.com/grpc/grpc-java/blob/master/SECURITY.md#troubleshooting 了解更多信息。
位于io.grpc.netty.GrpcSslContexts.selectApplicationProtocolConfig(GrpcSslContexts.java:163)
位于io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:136)
位于io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:124)
位于io.grpc.netty.GrpcSslContexts.forClient(GrpcSslContexts.java:94)
在btcduke.node.ln.HelloWorldClient。(HelloWorldClient.java:35)
位于btcduke.node.ln.HelloWorldClient.main(HelloWorldClient.java:76)
原因:java.lang.ClassNotFoundException:org/eclipse/jetty/alpn/alpn
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:348)
在io.grpc.netty.JettyTlsUtil.isJettyAlpnConfigured上(JettyTlsUtil.java:34)
位于io.grpc.netty.GrpcSslContexts.selectApplicationProtocolConfig(GrpcSslContexts.java:153)
... 还有5个
HelloWorldClient使用grpc,看起来grpc正在尝试动态加载ALPN类。我说得对吗?找不到此类,因此我收到错误消息。但请看一下,我可以访问这个类(我在第一行打印这个类)。有人知道为什么会这样吗?我不知道:/


我通过添加VM参数“-Xbootclasspath/p:“来运行配置选项,实际解决了这个问题,但我不明白为什么需要这样做,而且我认为这不是一个优雅的方法。

如果您收到错误消息“ALPN未正确配置”或“Jetty ALPN/NPN未正确配置”,这很可能意味着:

类路径中不存在与ALPN相关的 或者存在类路径冲突 或者由于依赖关系管理而使用了错误的版本

仔细查看提供的stacktrace,可以发现您需要正确配置“ALPN”

记录于

适用于最高1.8.0版本的Java 8。

您必须为您的特定JVM使用
alpn boot
提供程序,因为它修改OpenJDK类以支持alpn

请参阅ALPN至OpenJDK版本列表:

alpn boot-.jar
需要使用JVM命令行上的
-Xbootclasspath/p:
选项

对于特定版本的Jetty Server,您还将在普通服务器类路径上使用

适用于1.8.0_252及更高版本的Java 8(包括Java 9+)。

对于包含1.8.0_252及更高版本的Java 8,此提供程序使用Java 9中引入的标准OpenJDK ALPN API(见下文),该API已后端口到1.8.0_252,并且不需要命令行上的
-Xbootclasspath/p:
选项


对于此操作模式,请使用服务器类路径上的工件。

您是否阅读了错误消息中以“ALPN未正确配置”开头的部分?您认为
org/eclipse/jetty/alpn/alpn
是该类的正确名称吗?在进行更多猜测之前:查看forName方法调用引发的ClassNotFoundException的错误消息。它显示该调用中给定的名称字符串。斜杠是错误的-应该有句点来分隔包名。但这不是OP的问题。这正是OP的问题所在。类
org.eclipse.jetty.alpn.alpn
的加载方式与您想象的不同。它有一个引导类路径依赖项,阻止它正常加载。ClassNotFoundException的错误消息列出了Class.forName的参数。我认为类名没有斜杠作为包名之间的分隔符。不过,它可能来自配置文件。谢谢。我添加了VM参数“-Xbootclasspath/p:”以运行配置选项。问题已经过去了,但我不明白为什么我需要这样做,而且我也不认为这是一种优雅的方法。也许这是因为某种原因,在加载我的主要类之前必须加载这个类?@emraldinho我更新了答案。
Caused by: java.lang.ClassNotFoundException: 
org/eclipse/jetty/alpn/ALPN
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at 
io.grpc.netty.JettyTlsUtil.isJettyAlpnConfigured(JettyTlsUtil.java:34)