<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat @VERSION@</title>
<style type="text/css">
body { font-family: Arial, Helvetica, sans-serif; font-size: 11pt; }
dd { margin-top: 0.2em; margin-bottom: 0.5em; }
</style>
</head>
<body>

<h1 style="font-size: 1.3em;">Apache Tomcat @VERSION@</h1>
<p>Useful references:</p>
<ul>
<li><a href="RELEASE-NOTES">Release notes</a>, with important information
about known issues</li>
<li><a href="https://tomcat.apache.org/tomcat-@VERSION_MAJOR_MINOR@-doc/changelog.html">Changelog</a></li>
</ul>

<p><b>NOTE: The tar files in this distribution use GNU tar extensions,
and must be untarred with a GNU compatible version of tar. The version
of <code>tar</code> on Solaris and Mac OS X will not work with
these files.</b></p>

<p style="color: red;">Tomcat @VERSION_MAJOR_MINOR@ requires Java @MIN_JAVA_VERSION@ or later. Read the
RELEASE-NOTES and the RUNNING.txt file in the distribution for more details.
</p>

<h2 style="font-size: 1.1em;">Packaging Details (or "What Should I Download?")</h2>
<dl>
<dt><b>bin/</b></dt>
<dd><dl>
  <dt>apache-tomcat-[version].zip or .tar.gz</dt>
    <dd>Base distribution. These distributions do not include the Windows
    service wrapper nor the compiled APR/native library for Windows.</dd>
  <dt>apache-tomcat-[version].exe</dt>
    <dd>32-bit/64-bit Windows installer for Tomcat. &#xa0; Please note that while this
    distribution includes the vast majority of the base distribution, some of the
    command-line scripts for launching Tomcat are not included.  This distribution
    is intended for those users planning to launch Tomcat through the Windows
    shortcuts or services.</dd>
  <dt>apache-tomcat-[version]-windows-x86.zip</dt>
    <dd>32-bit Windows specific distribution that includes the Windows service
    wrapper and the compiled APR/native library for use with 32-bit JVMs on both
    32 and 64 bit Windows platforms.</dd>
  <dt>apache-tomcat-[version]-windows-x64.zip</dt>
    <dd>64-bit Windows specific distribution that includes the Windows service
    wrapper and the compiled APR/native library for use with 64-bit JVMs on
    x64 Windows platforms.</dd>
  <dt>apache-tomcat-[version]-deployer.zip or .tar.gz</dt>
    <dd>The standalone
    <a href="https://tomcat.apache.org/tomcat-@VERSION_MAJOR_MINOR@-doc/deployer-howto.html">
    Tomcat Web Application Deployer</a>.</dd>
  <dt>apache-tomcat-[version]-fulldocs.tar.gz</dt>
    <dd>The Tomcat documentation bundle, including complete javadocs.</dd>
</dl></dd>
<dt><b>bin/extras/</b></dt>
<dd><dl>
  <dt>catalina-ws.jar</dt>
    <dd>Web Services support (JSR 109). See the <a
    href="https://tomcat.apache.org/tomcat-@VERSION_MAJOR_MINOR@-doc/extras.html">
    extras documentation</a> for more information.</dd>
  <dt>catalina-jmx-remote.jar</dt>
    <dd>JMX Remote Lifecycle Listener. See the <a
    href="https://tomcat.apache.org/tomcat-@VERSION_MAJOR_MINOR@-doc/config/listeners.html">
    listeners documentation</a> for details.</dd>
</dl></dd>
<dt><b>src/</b></dt>
<dd><dl>
  <dt>apache-tomcat-[version].zip or .tar.gz</dt>
    <dd>The source code. See
    <a href="https://tomcat.apache.org/tomcat-@VERSION_MAJOR_MINOR@-doc/building.html">building instructions</a>.</dd>
</dl></dd>
</dl>

<p>Thank you for using <a href="https://tomcat.apache.org/">Tomcat</a>!
</p>
<p><b>The Apache Tomcat Project</b> <br /><a
href="https://tomcat.apache.org/">https://tomcat.apache.org/</a></p>
</body></html>
