#  Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  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.

######################################################################
# Apache Central Repository
######################################################################
maven.repo.central=www.apache.org
maven.repo.central.directory=/www/www.apache.org/dist/java-repository
maven.remote.group=apcvs
maven.changelog.factory = org.apache.maven.svnlib.SvnChangeLogFactory

######################################################################
# JUnit Testing
######################################################################
maven.test.failure = false
maven.junit.fork=true
maven.junit.dir=${maven.build.dir}
#maven.junit.sysproperties=org.xml.sax.driver java.security.auth.login.config
maven.junit.sysproperties=org.xml.sax.driver
org.xml.sax.driver=org.apache.xerces.parsers.SAXParser
#java.security.auth.login.config=applications/test/jaas.config


#If you wish to skip tests when doing builds, uncomment
#maven.test.skip = true

######################################################################
# Checkstyle
######################################################################
maven.checkstyle.properties= checkstyle.xml
maven.linkcheck.enable=false

######################################################################
# JavaDoc
#
# javadoc urls can be added here, multiple urls are appended using a comma
#
# maven.javadoc.links = http://foo/bar/api,\
#                       http://flim/flam/api/
######################################################################
maven.javadoc.links=http://java.sun.com/j2se/1.4.2/docs/api/,http://www.day.com/maven/jsr170/javadocs/jcr-0.16.4.1/
maven.javadoc.author=false
maven.javadoc.version=false

######################################################################
# Other opts
######################################################################
# uncomment the next line to work in offline mode (no jar download & no linkcheck)
#maven.mode.online=

maven.compile.debug=on
maven.compile.deprecation=off
maven.compile.optimize=off
maven.compile.source=1.4
maven.compile.target=1.4

maven.jarResources.basedir=src/java
maven.jar.excludes=**/package.html

# Location of the generated query language parsers. Needed for
# the Maven Eclipse plugin to automatically locate the generated
# source files. Note that this value matches the hardcoded path
# in the Maven JavaCC plugin. Therefore, do not change this value!
maven.gen.src=${maven.build.dir}/generated-src/main

# specifying additional remote repository for downloading dependencies
# not available at www.ibiblio.org/maven/
maven.repo.remote = http://www.ibiblio.org/maven/,http://www.day.com/maven/

######################################################################
# Site L&F
######################################################################
# maven.xdoc.jsl=
maven.xdoc.date=
maven.xdoc.poweredby.image=maven-feather.png
maven.xdoc.version=${pom.currentVersion}
maven.xdoc.developmentProcessUrl=http://jackrabbit.apache.org/
maven.docs.src=${basedir}/src/site/xdoc
maven.changelog.range=60
maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory
maven.multiproject.overviewPage.title=Jackrabbit components

# ------------------------------------------------------------------------
# M A V E N  J A R  O V E R R I D E
# ------------------------------------------------------------------------
#maven.jar.override = on
#maven.jar.jcr = ${basedir}/lib/jcr.jar

######################################################################
# Site Deploy (into ../jackrabbit-site for checkout on jackrabbit.apache.org)
######################################################################
maven.site.deploy.method=fs

# IDE settings
maven.eclipse.resources.addtoclasspath=true

