Apache Tomcat 6
Apache Tomcat 6
Table of Contents
Introduction
Windows
Unix daemon
Introduction
There are several ways to set up Tomcat for running on different platforms. The main
documentation for this is a file called RUNNING.txt. We encourage you to refer to that file
if the information below does not answer some of your questions.
Windows
Installing Tomcat on Windows can be done easily using the Windows installer. Its interface
and functionality is similar to other wizard based installers, with only a few items of interest.
The installer will create shortcuts allowing starting and configuring Tomcat. It is important
to note that the Tomcat administration web application can only be used when Tomcat is
running.
Unix daemon
Tomcat can be run as a daemon using the jsvc tool from the commons-daemon project.
Source tarballs for jsvc are included with the Tomcat binaries, and need to be compiled.
Building jsvc requires a C ANSI compiler (such as GCC), GNU Autoconf, and a JDK.
Before running the script, the JAVA_HOME environment variable should be set to the base path
of the JDK. Alternately, when calling the ./configure script, the path of the JDK may be
specified using the --with-java parameter, such as ./configure
--with-java=/usr/java.
Using the following commands should result in a compiled jsvc binary, located in
the $CATALINA_HOME/bin folder. This assumes that GNU TAR is used, and
that CATALINA_HOME is an environment variable pointing to the base path of the Tomcat
installation.
Please note that you should use the GNU make (gmake) instead of the native BSD make on
FreeBSD systems.
cd $CATALINA_HOME/bin
tar xvfz commons-daemon-native.tar.gz
cd commons-daemon-1.0.x-native-src/unix
./configure
make
cp jsvc ../..
cd ../..
CATALINA_BASE=$CATALINA_HOME
cd $CATALINA_HOME
./bin/jsvc \
-classpath $CATALINA_HOME/bin/bootstrap.jar \
-outfile $CATALINA_BASE/logs/catalina.out \
-errfile $CATALINA_BASE/logs/catalina.err \
-Dcatalina.home=$CATALINA_HOME \
-Dcatalina.base=$CATALINA_BASE \
-
Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
org.apache.catalina.startup.Bootstrap
jsvc has other useful parameters, such as -user which causes it to switch to another user
after the daemon initialization is complete. This allows, for example, running Tomcat as a
non privileged user while still being able to use privileged ports. jsvc --help will return
the full jsvc usage information. In particular, the -debug option is useful to debug issues
running jsvc.
Note that the Commons-Daemon JAR file must be on your runtime classpath to run Tomcat
in this manner. The Commons-Daemon JAR file is in the Class-Path entry of the
bootstrap.jar manifest, but if you get a ClassNotFoundException or a
NoClassDefFoundError for a Commons-Daemon class, add the Commons-Daemon JAR to
the -cp argument when launching jsvc.
Introduction
Tomcat 6 provides a JNDI InitialContext implementation instance for each web application
running under it, in a manner that is compatible with those provided by a Java2 Enterprise
Edition application server. The J2EE standard provides a standard set of elements in
the /WEB-INF/web.xml file to reference/define resources.
See the following Specifications for more information about programming APIs for JNDI,
and for the features supported by Java2 Enterprise Edition (J2EE) servers, which Tomcat
emulates for the services that it provides:
web.xml configuration
The following elements may be used in the web application deployment descriptor (/WEB-
INF/web.xml) of your web application to define resources:
Providing that Tomcat is able to identify an appropriate resource factory to use to create the
resource and that no further configuration information is required, Tomcat will use the
information in /WEB-INF/web.xml to create the resource.
context.xml configuration
If Tomcat is unable to identify the appropriate resource factory and/or additional
configuration information is required, additional Tomcat specific configuration must be
specified before Tomcat can create the resource. Tomcat specific resource configuration is
entered in the <Context> elements that can be specified in
either $CATALINA_BASE/conf/server.xml or, preferably, the per-web-application context
XML file (META-INF/context.xml).
Any number of these elements may be nested inside a <Context> element and will be
associated only with that particular web application.
If a resource has been defined in a <Context> element it is not necessary for that resource to
be defined in /WEB-INF/web.xml. However, it is recommended to keep the entry in /WEB-
INF/web.xml to document the resource requirements for the web application.
Where the same resource name has been defined for a <env-entry> element included in the
web application deployment descriptor (/WEB-INF/web.xml) and in
an <Environment> element as part of the <Context> element for the web application, the
values in the deployment descriptor will take precedence only if allowed by the
corresponding <Environment> element (by setting the override attribute to "true").
Global configuration
Tomcat 6 maintains a separate namespace of global resources for the entire server. These are
configured in the <GlobalNamingResources> element
of $CATALINA_BASE/conf/server.xml. You may expose these resources to web
applications by using a <ResourceLink> to include it in the per-web-application context.
If a resource has been defined using a <ResourceLink>, it is not necessary for that resource
to be defined in /WEB-INF/web.xml. However, it is recommended to keep the entry in /WEB-
INF/web.xml to document the resource requirements for the web application.
Using resources
The InitialContext is configured as a web application is initially deployed, and is made
available to web application components (for read-only access). All configured entries and
resources are placed in the java:comp/env portion of the JNDI namespace, so a typical
access to a resource - in this case, to a JDBC DataSource - would look something like this:
See Adding Custom Resource Factories for information about how to create, install,
configure, and use your own custom resource factory classes with Tomcat 6.
NOTE - Of the standard resource factories, only the "JDBC Data Source" and "User
Transaction" factories are mandated to be available on other platforms, and then they are
required only if the platform implements the Java2 Enterprise Edition (J2EE) specs. All
other standard resource factories, plus custom resource factories that you write yourself, are
specific to Tomcat and cannot be assumed to be available on other containers.
This resource factory can be used to create objects of any Java class that conforms to
standard JavaBeans naming conventions (i.e. it has a zero-arguments constructor, and has
property setters that conform to the setFoo() naming pattern. The resource factory will
create a new instance of the appropriate bean class every time a lookup() for this entry is
made.
Create the JavaBean class which will be instantiated each time that the resource factory is
looked up. For this example, assume you create a class com.mycompany.MyBean, which
looks like this:
package com.mycompany;
<resource-env-ref>
<description>
Object factory for MyBean instances.
</description>
<resource-env-ref-name>
bean/MyBeanFactory
</resource-env-ref-name>
<resource-env-ref-type>
com.mycompany.MyBean
</resource-env-ref-type>
</resource-env-ref>
WARNING - Be sure you respect the element ordering that is required by the DTD for web
application deployment descriptors! See the Servlet Specification for details.
A typical use of this resource environment reference might look like this:
To configure Tomcat's resource factory, add an element like this to the <Context> element
for this web application.
<Context ...>
...
<Resource name="bean/MyBeanFactory" auth="Container"
type="com.mycompany.MyBean"
factory="org.apache.naming.factory.BeanFactory"
bar="23"/>
...
</Context>
Note that the resource name (here, bean/MyBeanFactory must match the value specified in
the web application deployment descriptor. We are also initializing the value of
the bar property, which will cause setBar(23) to be called before the new bean is returned.
Because we are not initializing the foo property (although we could have), the bean will
contain whatever default value is set up by its constructor.
UserDatabase Resources
0. Introduction
<Resource name="UserDatabase"
auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"
readonly="false" />
The readonly attribute is optional and defaults to true if not supplied. If the XML is
writeable then it will be written to when Tomcat starts. WARNING: When the file is
written it will inherit the default file permissions for the user Tomcat is running as. Ensure
that these are appropriate to maintain the security of your installation.
In many web applications, sending electronic mail messages is a required part of the
system's functionality. The Java Mail API makes this process relatively straightforward, but
requires many configuration details that the client application must be aware of (including
the name of the SMTP host to be used for message sending).
Tomcat 6 includes a standard resource factory that will create javax.mail.Session session
instances for you, already configured to connect to an SMTP server. In this way, the
application is totally insulated from changes in the email server configuration environment -
it simply asks for, and receives, a preconfigured session whenever needed.
The first thing you should do is modify the web application deployment descriptor (/WEB-
INF/web.xml) to declare the JNDI name under which you will look up preconfigured
sessions. By convention, all such names should resolve to the mail subcontext (relative to
the standard java:comp/env naming context that is the root of all provided resource
factories. A typical web.xml entry might look like this:
<resource-ref>
<description>
Resource reference to a factory for javax.mail.Session
instances that may be used for sending electronic mail
messages, preconfigured to connect to the appropriate
SMTP server.
</description>
<res-ref-name>
mail/Session
</res-ref-name>
<res-type>
javax.mail.Session
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
WARNING - Be sure you respect the element ordering that is required by the DTD for web
application deployment descriptors! See the Servlet Specification for details.
Note that the application uses the same resource reference name that was declared in the
web application deployment descriptor. This is matched up against the resource factory that
is configured in the <Context> element for the web application as described below.
To configure Tomcat's resource factory, add an elements like this to the <Context> element
for this web application.
<Context ...>
...
<Resource name="mail/Session" auth="Container"
type="javax.mail.Session"
mail.smtp.host="localhost"/>
...
</Context>
Note that the resource name (here, mail/Session) must match the value specified in the
web application deployment descriptor. Customize the value of
the mail.smtp.host parameter to point at the server that provides SMTP service for your
network.
Additional resource attributes and values will be converted to properties and values and
passed to javax.mail.Session.getInstance(java.util.Properties) as part of
the java.util.Properties collection. In addition to the properties defined in Annex A of
the JavaMail specification, individual providers may also support additional properties.
Download the JavaMail API. The JavaMail API requires the Java Activation Framework
(JAF) API as well. The Java Activation Framework is included in Java SE 6 onwards. Java
SE 5 users can download the latest version, JAF 1.1.1.
Unpackage the distribution(s) and place mail.jar (and activation.jar if required) into
$CATALINA_HOME/lib so the JAR(s) is(are) available to Tomcat during the initialization
of the mail Session Resource. Note: placing jars in both $CATALINA_HOME/lib and a
web application's lib folder will cause an error, so ensure mail.jar (and activation.jar) is(are)
placed only the $CATALINA_HOME/lib location.
Example Application
The /examples application included with Tomcat contains an example of utilizing this
resource factory. It is accessed via the "JSP Examples" link. The source code for the servlet
that actually sends the mail message is in /WEB-INF/classes/SendMailServlet.java.
WARNING - The default configuration assumes that there is an SMTP server listing on
port 25 on localhost. If this is not the case, edit the <Context> element for this web
application and modify the parameter value for the mail.smtp.host parameter to be the
host name of an SMTP server on your network.
JDBC Data Sources
0. Introduction
Many web applications need to access a database via a JDBC driver, to support the
functionality required by that application. The J2EE Platform Specification requires J2EE
Application Servers to make available a DataSource implementation (that is, a connection
pool for JDBC connections) for this purpose. Tomcat 6 offers exactly the same support, so
that database-based applications you develop on Tomcat using this service will run
unchanged on any J2EE server.
NOTE - The default data source support in Tomcat is based on the DBCP connection pool
from the Commons project. However, it is possible to use any other connection pool that
implements javax.sql.DataSource, by writing your own custom resource factory, as
described below.
Use of the JDBC Data Sources JNDI Resource Factory requires that you make an
appropriate JDBC driver available to both Tomcat internal classes and to your web
application. This is most easily accomplished by installing the driver's JAR file(s) into
the $CATALINA_HOME/lib directory, which makes the driver available both to the resource
factory and to your application.
<resource-ref>
<description>
Resource reference to a factory for java.sql.Connection
instances that may be used for talking to a particular
database that is configured in the <Context>
configurartion for the web application.
</description>
<res-ref-name>
jdbc/EmployeeDB
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
WARNING - Be sure you respect the element ordering that is required by the DTD for web
application deployment descriptors! See the Servlet Specification for details.
Note that the application uses the same resource reference name that was declared in the
web application deployment descriptor. This is matched up against the resource factory that
is configured in the <Context> element for the web application as described below.
4. Configure Tomcat's Resource Factory
To configure Tomcat's resource factory, add an element like this to the <Context> element
for the web application.
<Context ...>
...
<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="dbusername"
password="dbpassword"
driverClassName="org.hsql.jdbcDriver"
url="jdbc:HypersonicSQL:database"
maxActive="8"
maxIdle="4"/>
...
</Context>
Note that the resource name (here, jdbc/EmployeeDB) must match the value specified in the
web application deployment descriptor.
This example assumes that you are using the HypersonicSQL database JDBC driver.
Customize the driverClassName and driverName parameters to match your actual
database's JDBC driver and connection URL.
The configuration properties for Tomcat's standard data source resource factory
(org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory) are as follows:
The optional evictor thread is responsible for shrinking the pool by removing any
conections which are idle for a long time. The evictor does not respect minIdle. Note that
you do not need to activate the evictor thread if you only want the pool to shrink according
to the configured maxIdle property.
The evictor is disabled by default and can be configured using the following properties:
The abandoning feature is disabled by default and can be configured using the following
properties:
Finally there are various properties that allow further fine tuning of the pool behaviour:
To create a resource factory that knows how to produce MyBean instances, you might create
a class like this:
package com.mycompany;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
For more information about ObjectFactory, see the JNDI 1.2 Service Provider Interface
(SPI) Specification.
You will need to compile this class against a class path that includes all of the JAR files in
the $CATALINA_HOME/lib directory. When you are through, place the factory class (and the
corresponding bean class) unpacked under $CATALINA_HOME/lib, or in a JAR file
inside $CATALINA_HOME/lib. In this way, the required class files are visible to both Catalina
internal resources and your web application.
<resource-env-ref>
<description>
Object factory for MyBean instances.
</description>
<resource-env-ref-name>
bean/MyBeanFactory
</resource-env-ref-name>
<resource-env-ref-type>
com.mycompany.MyBean
</resource-env-ref-type>
</resource-env-ref>
WARNING - Be sure you respect the element ordering that is required by the DTD for web
application deployment descriptors! See the Servlet Specification for details.
A typical use of this resource environment reference might look like this:
To configure Tomcat's resource factory, add an elements like this to the <Context> element
for this web application.
<Context ...>
...
<Resource name="bean/MyBeanFactory" auth="Container"
type="com.mycompany.MyBean"
factory="com.mycompany.MyBeanFactory"
bar="23"/>
...
</Context>
Note that the resource name (here, bean/MyBeanFactory must match the value specified in
the web application deployment descriptor. We are also initializing the value of
the bar property, which will cause setBar(23) to be called before the new bean is returned.
Because we are not initializing the foo property (although we could have), the bean will
contain whatever default value is set up by its constructor.
You will also note that, from the application developer's perspective, the declaration of the
resource environment reference, and the programming used to request new instances, is
identical to the approach used for the Generic JavaBean Resources example. This illustrates
one of the advantages of using JNDI resources to encapsulate functionality - you can change
the underlying implementation without necessarily having to modify applications using the
resources, as long as you maintain compatible APIs.
Non-DBCP Solutions
These solutions either utilise a single connection to the database (not recommended for
anything other than testing!) or some other pooling technology.
Oracle 8i with OCI client
Introduction
Whilst not strictly addressing the creation of a JNDI DataSource using the OCI client, these
notes can be combined with the Oracle and DBCP solution above.
In order to use OCI driver, you should have an Oracle client installed. You should have
installed Oracle8i(8.1.7) client from cd, and download the suitable JDBC/OCI
driver(Oracle8i 8.1.7.1 JDBC/OCI Driver) from otn.oracle.com.
You should next create a simple test servlet or jsp that has these critical lines:
DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());
conn =
DriverManager.getConnection("jdbc:oracle:oci8:@database","username","pas
sword");
where database is of the form host:port:SID Now if you try to access the URL of your test
servlet/jsp and what you get is a ServletException with a root cause
of java.lang.UnsatisfiedLinkError:get_env_handle.
a mismatch between your JDBC classes file and your Oracle client version.
The giveaway here is the message stating that a needed library file cannot be
found. For example, you may be using a classes12.zip file from Oracle
Version 8.1.6 with a Version 8.1.5 Oracle client. The classeXXXs.zip file and
Oracle client software versions must match.
A $PATH, LD_LIBRARY_PATH problem.
It has been reported that ignoring the driver you have downloded from otn
and using the classes12.zip file from the directory $ORAHOME\jdbc\lib will
also work.
Next you may experience the error ORA-06401 NETCMN: invalid driver designator
The Oracle documentation says : "Cause: The login (connect) string contains an invalid
driver designator. Action: Correct the string and re-submit." Change the database connect
string (of the form host:port:SID) with this
one: (description=(address=(host=myhost)(protocol=tcp)(port=1521))
(connect_data=(sid=orcl)))
Ed. Hmm, I don't think this is really needed if you sort out your TNSNames - but I'm not an
Oracle DBA :-)
Common Problems
Here are some common problems encountered with a web application which uses a database
and tips for how to solve them.
To collect data on how long garbage collection is taking add the -verbose:gc argument to
your CATALINA_OPTS environment variable when starting Tomcat. When verbose gc is
enabled your $CATALINA_BASE/logs/catalina.out log file will include data for every
garbage collection including how long it took.
When your JVM is tuned correctly 99% of the time a GC will take less than one second. The
remainder will only take a few seconds. Rarely, if ever should a GC take more than 10
seconds.
Make sure that the db connection timeout is set to 10-15 seconds. For the DBCP you set this
using the parameter maxWait.
Random Connection Closed Exceptions
These can occur when one request gets a db connection from the connection pool and closes
it twice. When using a connection pool, closing the connection just returns it to the pool for
reuse by another request, it doesn't close the connection. And Tomcat uses multiple threads
to handle concurrent requests. Here is an example of the sequence of events which could
cause this error in Tomcat:
Here is an example of properly written code to use a database connection obtained from a
connection pool: