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

时间:2017-12-29 21:35:25

标签: 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.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

HelloWorldClient使用grpc,看起来grpc试图动态加载ALPN类。我对吗?这个类无法找到,所以我有错误信息。但是请看一下,我可以访问这个类(我在第一行打印这个类)。有谁知道为什么会这样发生?我不知道:/

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

2 个答案:

答案 0 :(得分:3)

ALPN支持非常特定于JVM ,仅仅具有接口类是不够的。您还需要命令行上的运行时JVM特定引导类路径(-Xbootclasspath)条目才能使ALPN正常运行。

注意:Java 9+没有引导类路径要求,但它仍然需要包含运行时JVM特定的实现jar。

答案 1 :(得分:1)

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

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

仔细查看提供的堆栈跟踪,它显示您需要正确配置“ALPN”

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)