#
#  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.   
#
# -------------------------------------------------------------------
# I N C L U D E   P R O P E R T I E S
# -------------------------------------------------------------------
# Specifies the location of jar files to include in the classpath


#
# the relative base directory
#

jsieve.dir = ${basedir}

#
#  third party binary directories
#

lib.dir = ${jsieve.dir}/stage

# --------------------------------------------------
#                REQUIRED LIBRARIES
# --------------------------------------------------

# ----- From lib

# ----- Commons -----
commons-logging.jar=${lib.dir}/commons-logging/jars/commons-logging-1.1.1.jar

# ----- Log4J -----
log4j.jar=${lib.dir}/log4j/jars/log4j-1.2.14.jar

# ----- JUnit -----
junit.jar=${lib.dir}/junit/jars/junit-3.8.1.jar

# ----- JavaCC ----
javacc.jar=javacc-4.0.jar

# ----- BND tool -----
bnd.jar.relative=stage/biz.aQute/jars/bnd-0.0.249.jar

# --------------------------------------------------
#                LIBRARIES REQUIRED FOR TESTING
# --------------------------------------------------
mail.jar=mail-1.4.1.jar
activation.jar=activation-1.1.1.jar
