Как запустить Jetty с SPDY, используя ALPN?

Я вернулся в JDK8 с Jetty и SPDY и вижу, что теперь Jetty 9.2 поддерживает протокол ALPN вместо NPN (см. Мой вопрос Как запустить Jetty с SPDY на JDK8?). Итак, я установил bootclasspath:

java -Xbootclasspath/p:c:/jars/alpn-boot/alpn-boot-8.0.0.v2014031 ...

Но теперь я получил исключение:

Exception in thread "xyz.server" java.lang.NoClassDefFoundError:
        org/eclipse/jetty/npn/NextProtoNego$ServerProvider
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    ...
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:63)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:53)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:43)
    at xyz.my.my_httpsrv_jetty.startHTTPSServer(my_httpsrv_jetty.java:359)
    ...

я использую java version "1.8.0_05" и причал 9.2.2.v20140723.

Такую же ошибку я получил с JDK 1.7 и alpn-boot-7.0.0.v20140317.jar на WinXP, где я изменился, если из -Xbootclasspath/p:c:/jars/npn-boot/npn-boot-1.1.7.v20140316.jar

Это исключение указывает в моем коде на:

SSLconnector = new HTTPSPDYServerConnector(server, sslContextFactory);

Кажется, что даже с ALPN jetty нужны классы от npn-boot. Это ошибка или я сделал что-то не так?

1 ответ

Решение

HTTPSPDYServerConnector не был обновлен до ALPN и в настоящее время жестко использует NPN.

Для использования ALPN с SPDY необходимо настроить ServerConnector вместо этого таким образом:

SslContextFactory sslContextFactory = new SslContextFactory();
HttpConfiguration httpConfig = new HttpConfiguration();

SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, "alpn");
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory("spdy/3", "http/1.1");
alpn.setDefaultProtocol("http/1.1");
HTTPSPDYServerConnectionFactory spdy = new HTTPSPDYServerConnectionFactory(SPDY.V3, httpConfig);
HttpConnectionFactory http = new HttpConnectionFactory(httpConfig);

Server server = new Server();
ServerConnector connector = new ServerConnector(server, new ConnectionFactory[]{ssl, alpn, spdy, http});

server.start();

Я отслеживал это как https://bugs.eclipse.org/bugs/show_bug.cgi?id=440756.

Наконец, если вы не используете код напрямую, а используете Jetty в качестве сервера и развертываете на нем веб-приложения, Jetty уже правильно настраивает либо ALPN, либо NPN в зависимости от активированных модулей.

Другие вопросы по тегам