#   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.
##########################################################################
# Sample Ant build.properties file
#
# This setup assumes dependent jars are in a local maven 1 repository.
# However the jars are located, the properties ending in ".jar" need
# expand to full paths to the jars.
##########################################################################

# Repository base path
repository=${user.home}/.maven/repository

# commons-pool.jar - path to commons-pool-1.3.jar
commons-pool.home=${repository}/commons-pool/jars
commons-pool.jar=${commons-pool.home}/commons-pool-1.3.jar

# JDBC Optional Package 2.0 (also included in j2ee.jar)
jdbc20ext.home=${user.home}/jdbc2_0-stdext
jdbc20ext.lib=${jdbc20ext.home}
jdbc20ext.jar=${jdbc20ext.lib}/jdbc2_0-stdext.jar

# Junit
junit.home=${user.home}/junit3.8.1
junit.lib=${junit.home}
junit.jar=${junit.lib}/junit.jar

# XML parser
xerces.home=${repository}/xerces/jars
xerces.jar=${xerces.home}/xerces-2.0.2.jar
xml-apis.home=${repository}/xml-apis/jars
xml-apis.jar=${xml-apis.home}/xml-apis-2.0.2.jar

# Tomcat naming jars - needed only for JNDI tests
naming.home=${repository}/tomcat/jars
naming-common.jar=${naming.home}/naming-common-5.0.28.jar 
naming-java.jar=${naming.home}/naming-java-5.0.28.jar 

# Commons logging - dependency of naming jars
logging.home=${repository}/commons-logging/jars
logging.jar=${logging.home}/commons-logging-1.0.4.jar
