3

我有这样的代码:

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 参数“-Xbootclasspath/p:”来运行配置选项彻底解决了这个问题,但我不明白为什么我需要这样做,而且我认为这不是优雅的方法。

4

2 回答 2

3

记录在https://www.eclipse.org/jetty/documentation/jetty-9/index.php#alpn-chapter

对于 Java 8,最高包括 1.8.0_242。

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

请参阅 ALPN 到 OpenJDK 版本列表:
https ://www.eclipse.org/jetty/documentation/jetty-9/index.html#alpn-versions

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

您还将jetty-alpn-openjdk8-server-<ver>.jar在您的特定版本的 Jetty 服务器的正常服务器类路径上使用。

适用于 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:命令行上的选项

对于此操作模式,请使用jetty-alpn-java-server-<ver>.jar服务器类路径上的工件。

于 2017-12-29T21:42:28.690 回答
1

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

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

仔细查看提供的堆栈跟踪,它表明您需要正确配置“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)
于 2017-12-29T21:41:46.553 回答