#
#  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.
#

# -------------------------------------------------------------------
# build.properties.sample
#
# This is an example "build.properties" file, used to customize 
# building Jakarta Coyote for your local environment.  
# Make any changes you need, and rename this file to 
# "build.properties" 
#
# $Id$
# -------------------------------------------------------------------


# -------------------------------------------------------------------
# CONFIGURATION OPTIONS
# -------------------------------------------------------------------

# 


# -------------------------------------------------------------------
# EXTERNAL DEPENDENCIES 
# -------------------------------------------------------------------

# tomcat-util.jar -- Tomcat util package
tomcat-util.jar=../util/build/lib/tomcat-util.jar

# coyote.jar -- Coyote package
coyote.jar=../coyote/dist/coyote.jar

# junit.jar -- JUnit classes (http://junit.org)
junit.jar=/java/junit/junit.jar

# commons-logging.jar -- Commons Logging 1.0 package
commons-logging.jar=../lib/commons-logging.jar

# ----- Jakarta Regular Expressions Library, version 1.3 -----
regexp.jar=../lib/jakarta-regexp-1.3.jar
