#   Copyright 2003-2004 The Apache Software Foundation
#
#   Licensed 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.

# $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//validator/build.properties.sample,v 1.11 2004/02/29 09:48:28 scolebourne Exp $
# $Revision: 1.11 $
# $Date: 2004/02/29 09:48:28 $
# -----------------------------------------------------------------------------
# This is an example "build.properties" file.  Make any changes you need, 
# and rename this file to "build.properties" in the same directory that 
# contains the "build.xml" file.
# -----------------------------------------------------------------------------
apache.dir=D:/Java/Programs/Apache
# The JAR file containing version 1.6.1 (or later) of the Beanutils package
# from the Jakarta Commons project.
commons-beanutils.jar=../beanutils/dist/commons-beanutils.jar

# The JAR file containing version 2.1 (or later) of the Collections package
# from the Jakarta Commons project.
commons-collections.jar=../collections/dist/commons-collections.jar

# The JAR file containing version 1.5 (or later) of the Digester package
# from the Jakarta Commons project.
commons-digester.jar=../digester/dist/commons-digester.jar

# The JAR file containing version 1.0.3 (or later) of the Logging package
# from the Jakarta Commons project.
commons-logging.jar=../logging/dist/commons-logging.jar

# The JAR file containing version 2.07 (or later) of 
# the the Jakarta ORO project.
oro.jar=${apache.dir}/jakarta-oro-2.0.7/jakarta-oro-2.0.7.jar

# The JAR file containing version 3.8.1 (or later) of
# JUnit Unit Testing (http://www.junit.org)
junit.jar=D:/java/Lib/junit3.8.1/junit.jar

# Needed for building the Javadocs
xerces.jar=${apache.dir}/xerces-1_4_2/xerces.jar

# jsdoc 1.5.2 or Newer is needed for building the Javascript Javadocs
jsdoc.home=/cygdrive/d/Projects/Sourceforge/JsDoc/JSDoc-1.5.2

#############################Maven Variables #######################################
# CVS Start Change Log date
maven.changelog.range=2000


# If you are using ssh tunneling & have a .cvspass file setup
cvs.developer.host=localhost
# Maven deploy user
cvs.developer.id=rleland

######## Maven Variables located in your $HOME/build.properties ####
# maven.username=rleland
# maven.mode.online=true
# maven.debugOn=true

