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

#
#   Providing a build.properties file is no longer 
#      necessary for an Ant build as long as one Maven build
#      has previously been performed.
#


#   base location of support directories
#
lib.home.dir=/java

# The jaxp interface and a jaxp parser are required
# to build the DOMConfigurator.
#
#   modern equivalent is xml-commons-apis.jar
#
jaxp.home=${lib.home.dir}/crimson-1.1.3
jaxp.jaxp.jar=${jaxp.home}/crimson.jar

# JavaMail API Required to build the SMTPAppender
javamail.jar=${lib.home.dir}/javamail-1.3.2/mail.jar

# and JavaBeans Activation Framework
# http://java.sun.com/products/javabeans/jaf/index.jsp
activation.jar=${lib.home.dir}/jaf-1.0.2/activation.jar


# JMS interfaces are required to be on the classpath
# in order to build the JMSAppender.
jms.jar=${lib.home.dir}/jms1.1/lib/jms.jar

# Required to build the org.apache.log4j.jmx package.
jmx.home.dir=${lib.home.dir}/jmx-1_2_1-bin
jmx.jar=${jmx.home.dir}/lib/jmxri.jar
jndi.jar=${lib.home.dir}/jndi-1_2_1/lib/jndi.jar

# Required to run Checkstyle. Available from http://checkstyle.sf.net
checkstyle.jar=${lib.home.dir}/checkstyle-2.2/checkstyle-all-2.2.jar

# Velocity's Anakia task is used in the generation of the documentation
# download from http://jakarta.apache.org
velocity.jar=${lib.home.dir}/velocity-1.4/velocity-dep-1.4.jar
# Velocity's Anakia task requires JDOM, 
# but Velocity 1.4 is not compatible with JDOM 1.0, but beta 8 works okay
# download for http://www.jdom.org/dist/binary/archive
jdom.jar=${lib.home.dir}/jdom-b8/build/jdom.jar


#
#   CLIRR binary compatibility checker
#      http://clirr.sourceforge.net
clirr-core.jar=${lib.home.dir}/clirr-0.6/clirr-core-0.6.jar
#  bcel 5.1 will throw NullPointerExceptions
bcel.jar=${lib.home.dir}/bcel-5.2/bcel-5.2.jar
