  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.

$Id$

                 ============================================
                 Running The Tomcat 5.5 Servlet/JSP Container
                 ============================================

Out of the box, Tomcat 5.5 requires the Java 2 Standard Edition Runtime
Environment (JRE) version 5.0 or later.  However, you can also run Tomcat
5.5 on earlier versions of the JRE, as detailed below.

=============================
Running With JRE 5.0 Or Later
=============================

(1) Download and Install the J2SE Runtime Environment (JRE)

(1.1) Download the Java 2 Standard Edition Runtime Environment (JRE),
      release version 5.0 or later, from http://java.sun.com/j2se.

(1.2) Install the JRE according to the instructions included with the
      release.

(1.3) Set an environment variable named JRE_HOME to the pathname of
      the directory into which you installed the JRE, e.g. c:\jre5.0
      or /usr/local/java/jre5.0.

NOTE: You may also use the full JDK rather than just the JRE. In this
      case set the JAVA_HOME environment variable to the pathname of
      the directory into which you installed the JDK, e.g. c:\j2sdk5.0
      or /usr/local/java/j2sdk5.0.


(2) Download and Install the Tomcat Binary Distribution

NOTE:  As an alternative to downloading a binary distribution, you can create
your own from the Tomcat source repository, as described in "BUILDING.txt".
If you do this, the value to use for "${catalina.home}" will be the "dist"
subdirectory of your source distribution.

(2.1) Download a binary distribution of Tomcat from:

      http://tomcat.apache.org

(2.2) Unpack the binary distribution into a convenient location so that the
      distribution resides in its own directory (conventionally named
      "apache-tomcat-[version]").  For the purposes of the remainder of this document,
      the symbolic name "$CATALINA_HOME" is used to refer to the full
      pathname of the release directory.


(3) Start Up Tomcat

(3.1) Tomcat can be started by executing the following commands:

      $CATALINA_HOME\bin\startup.bat          (Windows)

      $CATALINA_HOME/bin/startup.sh           (Unix)

(3.2) After startup, the default web applications included with Tomcat will be
      available by visiting:

      http://localhost:8080/

(3.3) Further information about configuring and running Tomcat can be found in
      the documentation included here, as well as on the Tomcat web site:

      http://tomcat.apache.org


(4) Shut Down Tomcat

(4.1) Tomcat can be shut down by executing the following command:

      $CATALINA_HOME\bin\shutdown            (Windows)

      $CATALINA_HOME/bin/shutdown.sh         (Unix)



====================================
Running Tomcat With J2SE Version 1.4
====================================

(1) Obtain the compat package:

(1.1) Download the compat package from the binary download site:
      http://tomcat.apache.org

      * Or build this package yourself from the source code: see 
        "BUILDING.txt" in this directory.

(2) Unzip the package in $CATALINA_HOME.  It will place the XML
    parser APIs and Xerces implementation in the common/endorsed
    directory, and the JMX API jar (jmx.jar from Sun) in the bin
    directory.

(3) Follow the same directions for starting and stopping the
    server as if you were using J2SE 5.0.


==================================================
Advanced Configuration - Multiple Tomcat Instances
==================================================

In many circumstances, it is desirable to have a single copy of a Tomcat
binary distribution shared among multiple users on the same server.  To make
this possible, you can set the $CATALINA_BASE environment variable to the
directory that contains the files for your 'personal' Tomcat instance.

When you use $CATALINA_BASE, Tomcat will calculate all relative references for
files in the following directories based on the value of $CATALINA_BASE instead
of $CATALINA_HOME:

* bin  - Only setenv.sh (*nix) and setenv.bat (windows)

* conf - Server configuration files (including server.xml)

* logs - Log and output files

* shared - For classes and resources that must be shared across all web
           applications

* webapps - Automatically loaded web applications

* work - Temporary working directories for web applications

* temp - Directory used by the JVM for temporary files (java.io.tmpdir)

If you do not set $CATALINA_BASE, $CATALINA_BASE will default to the same value
as $CATALINA_HOME, which means that the same directory is used for all relative
path resolutions.

The administration and manager web applications, which are defined in the
$CATALINA_BASE/conf/Catalina/localhost/admin.xml
and 
$CATALINA_BASE/conf/Catalina/localhost/manager.xml files, will
not run in that configuration, unless either:
- The path specified in the docBase attribute of the Context element is made
  absolute, and replaced respectively by $CATALINA_HOME/server/webapps/admin
  and $CATALINA_HOME/server/webapps/manager
- Both web applications are copied or moved to $CATALINA_BASE, 
  and the path specified in the docBase attribute of the Context
  element is modified appropriately.
- Both web applications are disabled by removing
  $CATALINA_BASE/conf/Catalina/localhost/admin.xml
  and
  $CATALINA_BASE/conf/Catalina/localhost/manager.xml.


================
Troubleshooting
================

There are only really 3 things likely to go wrong during the stand-alone
Tomcat install:

(1) The most common hiccup is when another web server (or any process for that
    matter) has laid claim to port 8080.  This is the default HTTP port that
    Tomcat attempts to bind to at startup.  To change this, open the file:

       $CATALINA_HOME/conf/server.xml

    and search for '8080'.  Change it to a port that isn't in use, and is
    greater than 1024, as ports less than or equal to 1024 require superuser
    access to bind under UNIX.

   Restart Tomcat and you're in business.  Be sure that you replace the "8080"
   in the URL you're using to access Tomcat.  For example, if you change the
   port to 1977, you would request the URL http://localhost:1977/ in your browser.

(2) An "out of environment space" error when running the batch files in
    Windows 95, 98, or ME operating systems.

    Right-click on the STARTUP.BAT and SHUTDOWN.BAT files.  Click on
    "Properties", then on the "Memory" tab.  For the "Initial environment" field,
    enter in something like 4096.

    After you click apply, Windows will create shortcuts which you can use
    to start and stop the container.

(3) The 'localhost' machine isn't found.  This could happen if you're behind a
    proxy.  If that's the case, make sure the proxy configuration for your
    browser knows that you shouldn't be going through the proxy to access the
    "localhost".

    In Netscape, this is under Edit/Preferences -> Advanced/Proxies, and in
    Internet Explorer, Tools -> Internet Options -> Connections -> LAN Settings.
