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

# ----- Version Control Flags -----
version.major=1
version.minor=2
version.build=9
version.patch=0
version.suffix=-dev

# ----- Default Base Path for Dependent Packages -----
# Please note this path must be absolute, not relative,
# as it is referenced with different working directory
# contexts by the various build scripts.
base.path=/usr/share/java
#base.path=C:/path/to/the/repository
#base.path=/usr/local

compile.source=1.8
compile.target=1.8
compile.debug=off
compile.deprecation=on
compile.optimize=on

base-tomcat.loc=http://archive.apache.org/dist/tomcat
base-sf.loc=http://downloads.sourceforge.net

# ----- JUnit Unit Test Suite, version 3.8 or later -----
# The JUnit version we will use
junit.version=3.8.2
# The directory containing your binary distribution of JUnit
# It will be automatically downloaded if it doesn't exist
junit.home=${base.path}/junit${junit.version}
# The pathname of the "junit.jar" JAR file
junit.jar=${junit.home}/junit.jar
# The URL used to download JUnit if needed
junit.loc=${base-sf.loc}/junit/junit${junit.version}.zip
