| <html><head> |
| <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> |
| <title>Chapter 15. Application Layer Protocol Negotiation (ALPN)</title><link rel="stylesheet" type="text/css" href="css/docbook.css"><meta name="generator" content="DocBook XSL Stylesheets V1.79.1"><meta name="keywords" content="jetty, servlet, servlet-api, cometd, http, websocket, eclipse, maven, java, server, software"><link rel="home" href="index.html" title="Jetty"><link rel="up" href="jetty-admin-guide.html" title="Part III. Jetty Administration Guide"><link rel="prev" href="jetty-jconsole.html" title="Managing Jetty with JConsole and JMC"><link rel="next" href="http2.html" title="Chapter 16. HTTP/2"><link xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" rel="shortcut icon" href="images/favicon.ico"><link rel="stylesheet" href="css/highlighter/foundation.css"><script src="js/highlight.pack.js"></script><script> |
| hljs.initHighlightingOnLoad(); |
| </script><link type="text/css" rel="stylesheet" href="css/font-awesome/font-awesome.min.css"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><tr><td style="width: 25%"><a href="http://www.eclipse.org/jetty"><img src="images/jetty-header-logo.png" alt="Jetty Logo"></a><br><span style="font-size: small"> |
| Version: 9.3.28.v20191105</span></td><td style="width: 50%"></td></tr></table><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 15. Application Layer Protocol Negotiation (ALPN)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="jetty-jconsole.html"><i class="fa fa-chevron-left" aria-hidden="true"></i> Previous</a> </td><th width="60%" align="center">Part III. Jetty Administration Guide<br><a accesskey="p" href="index.html"><i class="fa fa-home" aria-hidden="true"></i> Home</a></th><td width="20%" align="right"> <a accesskey="n" href="http2.html">Next <i class="fa fa-chevron-right" aria-hidden="true"></i></a></td></tr></table><hr></div><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="jetty-callout"><h5 class="callout"><a href="http://www.webtide.com/">Contact the core Jetty developers at |
| <span class="website">www.webtide.com</span></a></h5><p> |
| private support for your internal/customer projects ... custom extensions and distributions ... versioned snapshots for indefinite support ... |
| scalability guidance for your apps and Ajax/Comet projects ... development services for sponsored feature development |
| </p></div><div class="chapter"><div class="titlepage"><div><div><h2 class="title"><a name="alpn-chapter"></a>Chapter 15. Application Layer Protocol Negotiation (ALPN)</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl class="toc"><dt><span class="section"><a href="alpn-chapter.html#alpn">Introducing ALPN</a></span></dt></dl></div><p>The development of new web protocols such as HTTP/2 raised the need of protocol negotiation within a Transport Layer Security (TLS) handshake. |
| A protocol negotiation called <a class="link" href="https://tools.ietf.org/html/rfc7301" target="_top">ALPN</a> (Application Layer Protocol Negotiation) RFC7301 has been defined to accomplish this.</p><p>ALPN has now replaced the older (and now fully deprecated) NPN in the general Web of 2016.</p><p>For those browsers that support HTTP/2, they all now support the ALPN negotiation layers for TLS. |
| Starting with Jetty 9.3.0, only ALPN is supported by Jetty.</p><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="alpn"></a>Introducing ALPN</h2></div></div></div><div class="toc"><dl class="toc"><dt><span class="section"><a href="alpn-chapter.html#alpn-starting">Starting the JVM</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-understanding">Understanding the ALPN API</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-client-example">Client Example</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-server-example">Server Example</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-implementation">Implementation Details</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-tests">Unit Tests</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-debugging">Debugging</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-license-details">License Details</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-versions">Versions</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-build">How to build ALPN</a></span></dt></dl></div><p>The Jetty project provides an implementation of the TLS extension for ALPN for OpenJDK 7 and OpenJDK 8. |
| ALPN allows the application layer to negotiate which protocol to use over the secure connection.</p><p>Any protocol can be negotiated by ALPN within a TLS connection. |
| The protocols that are most commonly negotiated are HTTP/2 (for browsers that support it) and, historically, SPDY. |
| The ALPN implementation is therefore not HTTP/2 or SPDY specific in any way. |
| Jetty’s ALPN implementation, although hosted under the umbrella of the Jetty project, is independent of Jetty (the Servlet Container); you can use the ALPN implementation in any other Java network server.</p><p>The Jetty distribution will automatically enable ALPN when it is needed to by a HTTP/2 connector, so for the most part ALPN is transparent to the average deployer. |
| This section provides the detail required for non-standard deployments or developing to the ALPN API.</p><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-starting"></a>Starting the JVM</h3></div></div></div><p>To enable ALPN support, start the JVM as follows:</p><pre xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><code>java -Xbootclasspath/p:<path_to_alpn_boot_jar> ...</code></pre><p>Where <code class="literal">path_to_alpn_boot_jar</code> is the path on the file system for the ALPN Boot Jar file,such as the one at the Maven coordinates <code class="literal">org.mortbay.jetty.alpn:alpn-boot</code>.</p><p>Be certain <a class="link" href="alpn-chapter.html#alpn-versions" title="Versions">to get the ALPN Boot Jar version which matches the version of your JRE</a>.</p><div class="section"><div class="titlepage"><div><div><h4 class="title"><a name="alpn-osgi"></a>Starting in OSGi</h4></div></div></div><p>To use ALPN in an OSGi environment, in addition to putting the ALPN jar on the boot classpath for the container, you will also need to deploy the <code class="literal">jetty-osgi-alpn</code> jar. |
| This jar contains a Fragment-Host directive that ensures the ALPN classes will be available from the system bundle.</p><p>You can download the <a class="link" href="http://central.maven.org/maven2/org/eclipse/jetty/osgi/jetty-osgi-alpn/" target="_top">jetty-osgi-alpn jar</a> from Maven Central.</p></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-understanding"></a>Understanding the ALPN API</h3></div></div></div><p>Applications need to interact with ALPN TLS extension protocol negotiations. |
| For example, server applications need to know whether the client supports ALPN, and client applications needs to know whether the server supports ALPN.</p><p>To implement this interaction, Jetty’s ALPN implementation provides an API to applications, hosted at Maven coordinates |
| <code class="literal">org.eclipse.jetty.alpn:alpn-api</code>. |
| You need to declare this dependency as provided, because the <code class="literal">alpn-boot</code> jar already includes it (see the previous section), and it is therefore available from the boot classpath.</p><p>The API consists of a single class, <code class="literal">org.eclipse.jetty.alpn.ALPN</code>, and applications need to register instances of <code class="literal">SSLSocket</code> or <code class="literal">SSLEngine</code> with a <code class="literal">ClientProvider</code> or <code class="literal">ServerProvider</code> (depending on whether the application is a client application or server application). |
| Refer to <code class="literal">ALPN</code> Javadocs and to the examples below for further details about client and server provider methods.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-client-example"></a>Client Example</h3></div></div></div><pre xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><code>SSLContext sslContext = ...; |
| final SSLSocket sslSocket = (SSLSocket)context.getSocketFactory().createSocket("localhost", server.getLocalPort()); |
| |
| ALPN.put(sslSocket, new ALPN.ClientProvider() |
| { |
| @Override |
| public boolean supports() |
| { |
| return true; |
| } |
| |
| @Override |
| public List<String> protocols() |
| { |
| return Arrays.asList("h2", "http/1.1"); |
| } |
| |
| @Override |
| public void unsupported() |
| { |
| ALPN.remove(sslSocket); |
| } |
| |
| @Override |
| public void selected(String protocol) |
| { |
| ALPN.remove(sslSocket); |
| System.out.println("Protocol Selected is: " + protocol); |
| } |
| });</code></pre><p>The ALPN implementation calls <code class="literal">ALPN.ClientProvider</code> methods <code class="literal">supports()</code>, <code class="literal">protocols()</code>, <code class="literal">unsupported()</code> and <code class="literal">selected(String)</code>, so that the client application can:</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">Decide whether to support ALPN</li><li class="listitem">Provide the protocols supported</li><li class="listitem">Know whether the server supports ALPN</li><li class="listitem">Know the protocol chosen by the server</li></ul></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-server-example"></a>Server Example</h3></div></div></div><p>The example for SSLEngine is identical, and you just need to replace the SSLSocket instance with an SSLEngine instance.</p><pre xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><code>final SSLSocket sslSocket = ...; |
| ALPN.put(sslSocket, new ALPN.ServerProvider() |
| { |
| @Override |
| public void unsupported() |
| { |
| ALPN.remove(sslSocket); |
| } |
| |
| @Override |
| public String select(List<String> protocols); |
| { |
| ALPN.remove(sslSocket); |
| return protocols.get(0); |
| } |
| });</code></pre><p>The ALPN implementation calls <code class="literal">ALPN.ServerProvider</code> methods <code class="literal">unsupported()</code>, and <code class="literal">select(List<String>),</code> so that the server application can:</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">know whether the client supports ALPN.</li><li class="listitem">select one of the protocols the client supports.</li></ul></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-implementation"></a>Implementation Details</h3></div></div></div><p>It is important that implementations of <code class="literal">ALPN.ServerProvider</code> and <code class="literal">ALPN.ClientProvider</code> remove the <code class="literal">sslSocket</code> or <code class="literal">sslEngine</code> when the negotiation is complete, like shown in the examples above.</p><p>Failing to do so will cause a memory leak.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-tests"></a>Unit Tests</h3></div></div></div><p>You can write and run unit tests that use the ALPN implementation. |
| The solution that we use with Maven is to specify an additional command line argument to the Surefire plugin:</p><pre xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><code><project> |
| |
| <properties> |
| <alpn-boot-version>8.1.4.v20150727</alpn-boot-version> |
| </properties> |
| |
| <build> |
| <plugins> |
| <plugin> |
| <artifactId>maven-surefire-plugin</artifactId> |
| <configuration> |
| <argLine> |
| -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn-boot-version}/alpn-boot-${alpn-boot-version}.jar |
| </argLine> |
| </configuration> |
| </plugin> |
| |
| ... |
| |
| </plugins> |
| </build> |
| |
| ... |
| |
| </project></code></pre></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-debugging"></a>Debugging</h3></div></div></div><p>You can enable debug logging for the ALPN implementation in this way:</p><pre class="literallayout">ALPN.debug = true;</pre><p>Since the ALPN class is in the boot classpath, we chose not to use logging libraries because we do not want to override application logging library choices; therefore the logging is performed directly on <code class="literal">System.err</code>.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-license-details"></a>License Details</h3></div></div></div><p>The ALPN implementation relies on modification of a few OpenJDK classes and on a few new classes that need to live in the <code class="literal">sun.security.ssl</code> package. |
| These classes are released under the same GPLv2+exception license of OpenJDK.</p><p>The ALPN class and its nested classes are released under same license as the classes of the Jetty project.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-versions"></a>Versions</h3></div></div></div><p>The ALPN implementation, relying on modifications of OpenJDK classes, updates every time there are updates to the modified OpenJDK classes.</p><div class="table"><a name="d0e15527"></a><p class="title"><b>Table 15.1. ALPN vs. OpenJDK versions</b></p><div class="table-contents"><table class="table" summary="ALPN vs. OpenJDK versions" border="1"><colgroup><col class="col_1"><col class="col_2"></colgroup><thead><tr><th align="left" valign="top">OpenJDK version</th><th align="left" valign="top">ALPN version</th></tr></thead><tbody><tr><td align="left" valign="top"><p>1.7.0u40</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u45</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u51</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u55</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u60</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u65</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u67</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u71</p></td><td align="left" valign="top"><p>7.1.2.v20141202</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u72</p></td><td align="left" valign="top"><p>7.1.2.v20141202</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u75</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u76</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u79</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u80</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u05</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u11</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u20</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u25</p></td><td align="left" valign="top"><p>8.1.2.v20141202</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u31</p></td><td align="left" valign="top"><p>8.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u40</p></td><td align="left" valign="top"><p>8.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u45</p></td><td align="left" valign="top"><p>8.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u51</p></td><td align="left" valign="top"><p>8.1.4.v20150727</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u60</p></td><td align="left" valign="top"><p>8.1.5.v20150921</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u65</p></td><td align="left" valign="top"><p>8.1.6.v20151105</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u66</p></td><td align="left" valign="top"><p>8.1.6.v20151105</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u71</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u72</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u73</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u74</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u77</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u91</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u92</p></td><td align="left" valign="top"><p>8.1.8.v20160420</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u101</p></td><td align="left" valign="top"><p>8.1.9.v20160720</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u102</p></td><td align="left" valign="top"><p>8.1.9.v20160720</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u111</p></td><td align="left" valign="top"><p>8.1.9.v20160720</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u112</p></td><td align="left" valign="top"><p>8.1.10.v20161026</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u121</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u131</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u141</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u144</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u151</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u152</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u161</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u162</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u171</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u172</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u181</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u191</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u192</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u201</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u202</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u211<sup>[1]</sup></p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u212</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u221<sup>[1]</sup></p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u222</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u231<sup>[1]</sup></p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u232</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr></tbody></table></div></div><br class="table-break"><p><sup>[1]</sup> These are Oracle releases for which the source code is not available, |
| or it is unclear what exactly is because there is no correspondent tag in |
| the OpenJDK repository. |
| We assume that the source code for these releases is equivalent (at least |
| for the files modified to make ALPN work) to the release that follows |
| (for example, for 1.8.0u211 we assume that the source code is equivalent |
| to 1.8.0u212, for 1.8.0u221 we assume 1.8.0u222, etc.).</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-build"></a>How to build ALPN</h3></div></div></div><p>This section is for Jetty developers that need to update the ALPN implementation with the OpenJDK versions.</p><p>Clone the OpenJDK repository with the following command:</p><div class="screenexample"><pre class="screen">$ hg clone http://hg.openjdk.java.net/jdk7u/jdk7u jdk7u # OpenJDK 7 |
| $ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u # OpenJDK 8 |
| $ cd !$ |
| $ ./get_source.sh</pre></div><p>To update the source to a specific tag, use the following command:</p><div class="screenexample"><pre class="screen">$ ./make/scripts/hgforest.sh update <tag-name></pre></div><p>The list of OpenJDK tags can be obtained from these pages: <a class="link" href="http://hg.openjdk.java.net/jdk7u/jdk7u/tags" target="_top">OpenJDK 7</a> / <a class="link" href="http://hg.openjdk.java.net/jdk8u/jdk8u/tags" target="_top">OpenJDK 8</a>.</p><p>You will then need to compare and incorporate the OpenJDK source changes into the modified OpenJDK classes at the <a class="link" href="https://github.com/jetty-project/jetty-alpn" target="_top">ALPN GitHub Repository</a>, branch <code class="literal">openjdk7</code> for OpenJDK 7 and branch <code class="literal">master</code> for OpenJDK 8.</p></div></div></div><script type="text/javascript"> |
| SyntaxHighlighter.all() |
| </script><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="jetty-jconsole.html"><i class="fa fa-chevron-left" aria-hidden="true"></i> Previous</a> </td><td width="20%" align="center"><a accesskey="u" href="jetty-admin-guide.html"><i class="fa fa-chevron-up" aria-hidden="true"></i> Top</a></td><td width="40%" align="right"> <a accesskey="n" href="http2.html">Next <i class="fa fa-chevron-right" aria-hidden="true"></i></a></td></tr><tr><td width="40%" align="left" valign="top">Managing Jetty with JConsole and JMC </td><td width="20%" align="center"><a accesskey="h" href="index.html"><i class="fa fa-home" aria-hidden="true"></i> Home</a></td><td width="40%" align="right" valign="top"> Chapter 16. HTTP/2</td></tr></table></div><p xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><div class="jetty-callout"> |
| See an error or something missing? |
| <span class="callout"><a href="http://github.com/eclipse/jetty.project">Contribute to this documentation at |
| <span class="website"><i class="fa fa-github" aria-hidden="true"></i> Github!</span></a></span><span style="float: right"><i>(Generated: 2019-11-05)</i></span></div></p></body></html> |