#   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 2 repository.
# However the jars are located, the properties ending in ".jar" need to
# expand to full paths to the jars.
##########################################################################

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

# cglib
cglib.home=${repository}/cglib/cglib/3.0
cglib.jar=${cglib.home}/cglib-3.0.jar

# asm-util
asm-util.home=${repository}/org/ow2/asm/asm-util/4.0
asm-util.jar=${asm-util.home}/asm-util-4.0.jar

# asm
asm.home=${repository}/org/ow2/asm/asm/4.0
asm.jar=${asm.home}/asm-4.0.jar

# JUnit
junit.home=${repository}/junit/junit/4.10
junit.jar=${junit.home}/junit-4.10.jar
