569 lines
19 KiB
Plaintext
569 lines
19 KiB
Plaintext
|
================================================================================
|
||
|
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.
|
||
|
================================================================================
|
||
|
|
||
|
====================================================
|
||
|
Building The Apache Tomcat 8.0 Servlet/JSP Container
|
||
|
====================================================
|
||
|
|
||
|
This subproject contains the source code for Tomcat 8.0, a container that
|
||
|
implements the Servlet 3.1, JSP 2.3, EL 3.0 and WebSocket 1.1 specifications
|
||
|
from the Java Community Process <https://www.jcp.org/>.
|
||
|
|
||
|
Note: If you just need to run Apache Tomcat, it is not necessary to build
|
||
|
it. You may simply download a binary distribution. It is cross-platform.
|
||
|
Read RUNNING.txt for the instruction on how to run it.
|
||
|
|
||
|
In order to build a binary distribution version of Apache Tomcat from a
|
||
|
source distribution, do the following:
|
||
|
|
||
|
|
||
|
(1) Download and Install a Java Development Kit
|
||
|
|
||
|
1. If the JDK is already installed, skip to (2).
|
||
|
|
||
|
2. Download a version 7 of Java Development Kit (JDK) release (use the
|
||
|
latest update available for your chosen version) from one of:
|
||
|
|
||
|
http://www.oracle.com/technetwork/java/javase/downloads/index.html
|
||
|
http://openjdk.java.net/install/index.html
|
||
|
or another JDK vendor.
|
||
|
|
||
|
Note regarding later versions of Java:
|
||
|
|
||
|
As documented elsewhere, one of components in Apache Tomcat includes
|
||
|
a private copy of the Apache Commons DBCP library.
|
||
|
|
||
|
The JDBC interfaces implemented by DBCP frequently change in non-backwards
|
||
|
compatible ways between versions of the Java SE specification. Therefore,
|
||
|
it is likely that DBCP will only compile with the specific version of Java
|
||
|
listed above and that compilation will fail if a later version of Java is
|
||
|
used.
|
||
|
|
||
|
See Apache Commons DBCP project web site for more details on
|
||
|
available versions of the library and its requirements,
|
||
|
|
||
|
https://commons.apache.org/dbcp/
|
||
|
|
||
|
3. Install the JDK according to the instructions included with the release.
|
||
|
|
||
|
4. Set an environment variable JAVA_HOME to the pathname of the directory
|
||
|
into which you installed the JDK release.
|
||
|
|
||
|
|
||
|
(2) Install Apache Ant version 1.9.8 or later on your computer.
|
||
|
|
||
|
1. If Apache Ant version 1.9.8 or later is already installed on your
|
||
|
computer, skip to (3).
|
||
|
|
||
|
2. Download a binary distribution of Ant from:
|
||
|
|
||
|
https://ant.apache.org/bindownload.cgi
|
||
|
|
||
|
3. Unpack the binary distribution into a convenient location so that the
|
||
|
Ant release resides in its own directory (conventionally named
|
||
|
"apache-ant-[version]").
|
||
|
|
||
|
For the purposes of the remainder of this document, the symbolic name
|
||
|
"${ant.home}" is used to refer to the full pathname of the release
|
||
|
directory.
|
||
|
|
||
|
4. Create an ANT_HOME environment variable to point the directory
|
||
|
${ant.home}.
|
||
|
|
||
|
5. Modify the PATH environment variable to include the directory
|
||
|
${ant.home}/bin in its list. This makes the "ant" command line script
|
||
|
available, which will be used to actually perform the build.
|
||
|
|
||
|
|
||
|
(3) Building Tomcat 8.0
|
||
|
|
||
|
(3.1) Checkout or obtain the source code for Tomcat 8.0
|
||
|
|
||
|
Checkout the source using SVN, selecting a tag for released version or
|
||
|
trunk for the current development code, or download and unpack a source
|
||
|
package.
|
||
|
|
||
|
* Tomcat SVN repository URL:
|
||
|
|
||
|
https://svn.apache.org/repos/asf/tomcat/tc8.0.x/trunk/
|
||
|
|
||
|
* Source packages can be downloaded from:
|
||
|
|
||
|
https://tomcat.apache.org/download-80.cgi
|
||
|
|
||
|
The location where the source has been placed will be further referred as
|
||
|
${tomcat.source}.
|
||
|
|
||
|
The Tomcat local build process does not modify line-endings. The svn repository
|
||
|
is configured so that all files will be checked out with the line-ending
|
||
|
appropriate for the current platform. When using a source package you should
|
||
|
ensure that you use the source package that has the appropriate line-ending
|
||
|
for your platform:
|
||
|
|
||
|
zip -> CRLF
|
||
|
tar.gz -> LF
|
||
|
|
||
|
Note that the release build process does modify line-endings to ensure that
|
||
|
each release package has the appropriate line-endings.
|
||
|
|
||
|
(3.2) Building
|
||
|
|
||
|
1. The build is controlled by creating a ${tomcat.source}/build.properties
|
||
|
file.
|
||
|
|
||
|
It is recommended to always create the file, because of unfortunate
|
||
|
default value of base.path property. You may start with the following
|
||
|
content for the file:
|
||
|
|
||
|
# ----- Default Base Path for Dependent Packages -----
|
||
|
# Replace this path with the directory path where dependencies binaries
|
||
|
# should be downloaded
|
||
|
base.path=/home/me/some-place-to-download-to
|
||
|
|
||
|
2. Configure base.path property by adding it to the
|
||
|
${tomcat.source}/build.properties file.
|
||
|
|
||
|
The base.path property specifies the place where Tomcat dependencies
|
||
|
required by the build are downloaded. It is recommended to place this
|
||
|
directory outside of the source tree, so that you do not waste your
|
||
|
time re-downloading the libraries.
|
||
|
|
||
|
* NOTE: The default value of the base.path property configures the build script
|
||
|
to download the libraries required to build Tomcat to the
|
||
|
${user.home}/tomcat-build-libs directory.
|
||
|
|
||
|
* NOTE: Users accessing the Internet through a proxy must use the properties
|
||
|
file to indicate to Ant the proxy configuration.
|
||
|
|
||
|
The following properties should be added to the ${tomcat.source}/build.properties
|
||
|
file.
|
||
|
|
||
|
proxy.use=true
|
||
|
proxy.host=proxy.domain
|
||
|
proxy.port=8080
|
||
|
proxy.user=username
|
||
|
proxy.password=password
|
||
|
|
||
|
See Apache Ant documentation for the <setproxy> task for details.
|
||
|
|
||
|
3. Go to the sources directory and run Ant:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant
|
||
|
|
||
|
This will execute the "deploy" target in build.xml.
|
||
|
|
||
|
Once the build has completed successfully, a usable Tomcat installation
|
||
|
will have been produced in the ${tomcat.source}/output/build directory,
|
||
|
and can be started and stopped with the usual scripts.
|
||
|
|
||
|
Note that the build includes Tomcat documentation, which can be found
|
||
|
in the output/build/webapps/docs directory.
|
||
|
|
||
|
The path of the output directory can be controlled by specifying the
|
||
|
"tomcat.output" property in the build.properties file.
|
||
|
|
||
|
* NOTE: Do not run the build as the root user. Building and running Tomcat
|
||
|
does not require root privileges.
|
||
|
|
||
|
|
||
|
(4) Updating sources and rebuilding
|
||
|
|
||
|
It is recommended that you regularly update the downloaded Tomcat 8.0
|
||
|
sources using your SVN client.
|
||
|
|
||
|
For a quick rebuild of only modified code you can use:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant
|
||
|
|
||
|
|
||
|
(5) Special builds
|
||
|
|
||
|
There are several targets in Tomcat build files that are useful to be
|
||
|
called separately. They build components that you may want to build
|
||
|
quickly, or ones that are included in the full release and are not built
|
||
|
during the default "deploy" build.
|
||
|
|
||
|
(5.1) Building documentation
|
||
|
|
||
|
The documentation web application is built during the default "deploy"
|
||
|
build.
|
||
|
|
||
|
It can be built quickly by using the following commands:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant build-docs
|
||
|
|
||
|
The output of this command will be found in the following directory:
|
||
|
|
||
|
output/build/webapps/docs
|
||
|
|
||
|
|
||
|
The API documentation (Javadoc) is built during a "release" build. It is
|
||
|
easy to build it separately by using the following commands:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant javadoc
|
||
|
|
||
|
The output of this command will be found in the following directories:
|
||
|
|
||
|
output/dist/webapps/docs/api
|
||
|
output/dist/webapps/docs/elapi
|
||
|
output/dist/webapps/docs/jspapi
|
||
|
output/dist/webapps/docs/servletapi
|
||
|
|
||
|
|
||
|
(5.2) Building the extras (commons-logging, webservices etc.)
|
||
|
|
||
|
These components are documented on the "Additional Components"
|
||
|
(extras.html) page of documentation. They are built during a "release"
|
||
|
build.
|
||
|
|
||
|
You can build them by using the following commands:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant extras
|
||
|
|
||
|
(5.3) Building the embedded packages
|
||
|
|
||
|
These are built during a "release" build.
|
||
|
|
||
|
You can build them by using the following commands:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant embed
|
||
|
|
||
|
|
||
|
(6) Building a full release (as provided via the ASF download pages)
|
||
|
|
||
|
A full release includes the Windows installer which requires a Windows
|
||
|
environment to be available to create it. If not building in a Windows
|
||
|
environment, the build scripts assume that Wine is available. If this is not
|
||
|
the case, the skip.installer property may be set to skip the creation of the
|
||
|
Windows installer.
|
||
|
|
||
|
1. Configure GPG, if needed
|
||
|
|
||
|
If the released artifacts have to be cryptographically signed with a
|
||
|
PGP signature, like the official ASF releases are, the following
|
||
|
property can be added to the build.properties file:
|
||
|
|
||
|
# Location of GPG executable (used only for releases)
|
||
|
gpg.exec=/path/to/gpg
|
||
|
|
||
|
You do not need it if you do not plan to sign the release.
|
||
|
|
||
|
If "gpg.exec" property does not point to an existing file, it will be
|
||
|
ignored and this feature will be disabled.
|
||
|
|
||
|
You will be prompted for the GPG passphrase when the release build
|
||
|
starts, unless "gpg.passphrase" property is set.
|
||
|
|
||
|
2. If building the Windows installer
|
||
|
|
||
|
If running the build in a UAC enabled environment, building the Windows
|
||
|
installer requires elevated privileges. The simplest way to do this is to
|
||
|
open the command prompt used for the build with the "Run as administrator"
|
||
|
option.
|
||
|
|
||
|
3. Configure the code signing service
|
||
|
|
||
|
ASF committers performing official releases will need to configure the code
|
||
|
signing service so that the Windows installer is signed during the build
|
||
|
process. The following properties need to be added to the build.properties
|
||
|
file:
|
||
|
|
||
|
# Location of GPG executable (used only for releases)
|
||
|
# Code signing of Windows installer
|
||
|
do.codesigning=true
|
||
|
codesigning.user=request-via-pmc
|
||
|
codesigning.pwd=request-via-pmc
|
||
|
codesigning.partnercode=request-via-pmc
|
||
|
codesigning.service=Microsoft Windows Signing
|
||
|
|
||
|
Release managers will be provided with the necessary credentials by the PMC.
|
||
|
It will also be necessary to enable TLS 1.1 and TLS 1.2 by default (they are
|
||
|
disabled by default on Java 7) for the build process to communicate with the
|
||
|
code signing service. The simplest way is by setting the ANT_OPTS
|
||
|
environment variable. E.g. (for Windows):
|
||
|
|
||
|
set ANT_OPTS=-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
|
||
|
|
||
|
4. Build the release:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant release
|
||
|
|
||
|
|
||
|
(7) Tests
|
||
|
|
||
|
(7.1) Running Tomcat tests
|
||
|
|
||
|
Tomcat includes a number of junit tests. The tests are not run when a
|
||
|
release is built. There is separate command to run them.
|
||
|
|
||
|
To run the testsuite use the following command:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant test
|
||
|
|
||
|
It is advisable to redirect output of the above command to a file for later
|
||
|
inspection.
|
||
|
|
||
|
The JUnit reports generated by the tests will be written to the following
|
||
|
directory:
|
||
|
|
||
|
output/build/logs
|
||
|
|
||
|
By default the testsuite is run four times to test 4 different
|
||
|
implementations of Tomcat connectors: BIO, NIO, NIO2 and APR. (If you are not
|
||
|
familiar with Tomcat connectors, see config/http.html in documentation for
|
||
|
details).
|
||
|
|
||
|
The 4 runs are enabled and disabled individually by the following
|
||
|
properties, which all are "true" by default:
|
||
|
|
||
|
execute.test.bio=true
|
||
|
execute.test.nio=true
|
||
|
execute.test.nio2=true
|
||
|
execute.test.apr=true
|
||
|
|
||
|
The APR connector can be tested only if Tomcat-Native library binaries are
|
||
|
found by the testsuite. The "test.apr.loc" property specifies the directory
|
||
|
where the library binaries are located.
|
||
|
|
||
|
By default the "test.apr.loc" property specifies the following location:
|
||
|
|
||
|
output/build/bin/native/
|
||
|
|
||
|
If you are on Windows and want to test the APR connector you can put the
|
||
|
tcnative-1.dll file into ${tomcat.source}/bin/native/ and it will be copied
|
||
|
into the above directory when the build runs.
|
||
|
|
||
|
The unit tests include tests of the clustering functionality which require
|
||
|
multicast to be enabled. There is a simple application provided in the Tomcat
|
||
|
test source (org.apache.catalina.tribes.TesterMulticast) that can be used to
|
||
|
check if a machine supports multicast. Notes on enabling multicast for different
|
||
|
operating systems are provided in the Javadoc for that class.
|
||
|
|
||
|
|
||
|
(7.2) Running a single test
|
||
|
|
||
|
It is possible to run a single JUnit test class by adding the "test.entry"
|
||
|
property to the build.properties file. The property specifies the name of
|
||
|
the test class.
|
||
|
|
||
|
For example:
|
||
|
|
||
|
test.entry=org.apache.catalina.util.TestServerInfo
|
||
|
|
||
|
It is possible to further limit such run to a number of selected test
|
||
|
methods by adding "test.entry.methods" property. The property specifies a
|
||
|
comma-separated list of test case methods.
|
||
|
|
||
|
For example:
|
||
|
|
||
|
test.entry=org.apache.el.lang.TestELArithmetic
|
||
|
test.entry.methods=testMultiply01,testMultiply02
|
||
|
|
||
|
|
||
|
(7.3) Running a set of tests
|
||
|
|
||
|
It is possible to run a set of JUnit test classes by adding the "test.name"
|
||
|
property to the build.properties file. The property specifies an Ant
|
||
|
includes pattern for the fileset of test class files to run.
|
||
|
|
||
|
The default value is "**/Test*.java", so all test classes are being
|
||
|
executed (with few exceptions - see build.xml for several exclude patterns).
|
||
|
|
||
|
You can include multiple patterns by concatenating them with a comma (",")
|
||
|
as the separator.
|
||
|
|
||
|
For example:
|
||
|
|
||
|
test.name=**/TestSsl.java,**/TestWebSocketFrameClientSSL.java
|
||
|
|
||
|
You can exclude specific JUnit test classes by adding the "test.exclude"
|
||
|
property to the build.properties file. The property specifies an Ant
|
||
|
excludes pattern for the fileset of test class files to exclude form the run.
|
||
|
The default value is empty, so no classes are excluded. The syntax is the same
|
||
|
as for the property "test.name".
|
||
|
|
||
|
|
||
|
(7.4) Other configuration options
|
||
|
|
||
|
1. It is possible to configure the directory where JUnit reports are
|
||
|
written to. It is configured by "test.reports" property. The default
|
||
|
value is
|
||
|
|
||
|
output/build/logs
|
||
|
|
||
|
2. It is possible to enable generation of access log file when the tests
|
||
|
are run. This is off by default and can be enabled by the following
|
||
|
property:
|
||
|
|
||
|
test.accesslog=true
|
||
|
|
||
|
The "access_log.<date>" file will be written to the same directory as
|
||
|
JUnit reports,
|
||
|
|
||
|
output/build/logs
|
||
|
|
||
|
3. The testsuite respects logging configuration as configured by
|
||
|
${tomcat.source}/conf/logging.properties
|
||
|
|
||
|
The log files will be written to the temporary directory used by the
|
||
|
tests,
|
||
|
|
||
|
output/test-tmp/logs
|
||
|
|
||
|
4. It is possible to configure formatter used by JUnit reports.
|
||
|
Configuration properties are "junit.formatter.type",
|
||
|
"junit.formatter.extension" and "junit.formatter.usefile".
|
||
|
|
||
|
For example the following property disables generation of separate report
|
||
|
files:
|
||
|
|
||
|
junit.formatter.usefile=false
|
||
|
|
||
|
5. It is possible to speed up testing by letting JUnit to run several
|
||
|
tests in parallel.
|
||
|
|
||
|
This is configured by setting "test.threads" property. The recommended
|
||
|
value is one thread per core.
|
||
|
|
||
|
6. Optional support is provided for the Cobertura code coverage tool.
|
||
|
|
||
|
NOTE: Cobertura is licensed under GPL v2 with parts of it being under
|
||
|
Apache License v1.1. See https://cobertura.github.io/cobertura/ for details.
|
||
|
Using it during Tomcat build is optional and is off by default.
|
||
|
|
||
|
Cobertura can be enabled using the following properties:
|
||
|
|
||
|
test.cobertura=true
|
||
|
test.threads=1
|
||
|
|
||
|
Using Cobertura currently requires setting test.threads configuration
|
||
|
property to the value of 1. Setting that property to a different value
|
||
|
will disable code coverage.
|
||
|
|
||
|
The report files by default are written to
|
||
|
|
||
|
output/coverage
|
||
|
|
||
|
7. The performance tests are written to run reasonably powerful machines (such
|
||
|
as a developer may use day to day) assuming no other resource hungry
|
||
|
processes are running.
|
||
|
|
||
|
These assumptions are not always true (e.g. on CI systems running in a
|
||
|
virtual machine) so the performance tests may be disabled by using the
|
||
|
following property:
|
||
|
|
||
|
test.excludePerformance=true
|
||
|
|
||
|
8. Some tests include checks that the access log valve entries are as expected.
|
||
|
These checks include timings. On slower / loaded systems these checks will
|
||
|
often fail. The checks may be relaxed by using the following property:
|
||
|
|
||
|
test.relaxTiming=true
|
||
|
|
||
|
9. It is known that some platforms (e.g. OSX El Capitan) require IPv4 to
|
||
|
be the default for the multicast tests to work. This is configured by
|
||
|
the following property:
|
||
|
|
||
|
java.net.preferIPv4Stack=true
|
||
|
|
||
|
10. It is possible to control whether the output of the tests is displayed
|
||
|
on the console or not. By default it is displayed and can be disabled
|
||
|
by the following property:
|
||
|
|
||
|
test.verbose=true
|
||
|
|
||
|
(8) Source code checks
|
||
|
|
||
|
(8.1) Checkstyle
|
||
|
|
||
|
NOTE: Checkstyle is licensed under LGPL. Using Checkstyle during Tomcat
|
||
|
build is optional and is off by default.
|
||
|
|
||
|
See http://checkstyle.sourceforge.net/ for more information.
|
||
|
|
||
|
Tomcat comes with a Checkstyle configuration that tests its source code
|
||
|
for certain conventions, like presence of the license header.
|
||
|
|
||
|
To enable Checkstyle, add the following property to build.properties file:
|
||
|
|
||
|
execute.validate=true
|
||
|
|
||
|
Once Checkstyle is enabled, the check will be performed automatically
|
||
|
during the build. The check is run before compilation of the source code.
|
||
|
|
||
|
To speed-up repeated runs of this check, a cache is configured. The cache
|
||
|
is located in the following directory:
|
||
|
|
||
|
output/res/checkstyle
|
||
|
|
||
|
It is possible to run the check separately by calling the "validate"
|
||
|
target. The command is:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant -Dexecute.validate=true validate
|
||
|
|
||
|
|
||
|
(8.2) FindBugs
|
||
|
|
||
|
NOTE: FindBugs is licensed under LGPL. Using Findbugs during Tomcat build is
|
||
|
optional and is off by default.
|
||
|
|
||
|
See http://findbugs.sourceforge.net/ for more information.
|
||
|
|
||
|
To enable FindBugs, add the following property to build.properties file:
|
||
|
|
||
|
execute.findbugs=true
|
||
|
|
||
|
To compile Tomcat classes and generate a FindBugs report, call the
|
||
|
"findbugs" target. For example:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant -Dexecute.findbugs=true findbugs
|
||
|
|
||
|
The report file by default is written to
|
||
|
|
||
|
output/findbugs
|
||
|
|
||
|
|
||
|
(8.3) End-of-line conventions check
|
||
|
|
||
|
You usually would not need to run this check. You can skip this section.
|
||
|
|
||
|
Apache Tomcat project has convention that all of its textual source files,
|
||
|
stored in Subversion repository, are marked with Subversion property
|
||
|
"svn:eol-style" with value of "native". This convention makes the editing
|
||
|
of source code on different platforms easier.
|
||
|
|
||
|
This test is used by developers to check that the source code adheres to
|
||
|
this convention. It verifies that the ends of lines in textual files are
|
||
|
appropriate for the operating system where it is run. The idea is to run
|
||
|
this check regularly on two different platforms and notify developers when
|
||
|
an inconsistency is detected.
|
||
|
|
||
|
The command to run this test is:
|
||
|
|
||
|
cd ${tomcat.source}
|
||
|
ant validate-eoln
|