#   Copyright 2003-2004 The Apache Software Foundation
#
#   Licensed 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.

######################################################################
# Properties that override Maven build defaults
# $Id: project.properties,v 1.7 2004/12/10 05:11:55 martinc Exp $
######################################################################
#maven.repo.remote=http://www.ibiblio.org,http://maven-plugins.sf.net/maven


######################################################################
# Apache Central Repository
######################################################################

#maven.repo.central=www.apache.org
#maven.repo.central.directory=/www/www.apache.org/dist/java-repository
#maven.remote.group=apcvs



######################################################################
# JUnit Testing
######################################################################
maven.test.failure = false
maven.junit.fork=true

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



######################################################################
# commons site L&F
######################################################################
maven.xdoc.jsl=../commons-build/commons-site.jsl
maven.xdoc.date=left
maven.xdoc.poweredby.image=maven-feather.png
maven.xdoc.version=${pom.currentVersion}
maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html


# once we create a theme url it should go here.
#maven.xdoc.theme.url=????



######################################################################
# 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/products/j2se/1.4/docs/api


compile.debug = on
compile.optimize = off
compile.deprecation = off


# -------------------------------------------------------------------
# Default Maven properties for the SDOCBOOK plugin
# -------------------------------------------------------------------

maven.sdocbook.src.dir = ${basedir}/sdocbook

maven.sdocbook.generated.html = ${maven.build.dir}/generated-docbooks/html
maven.sdocbook.generated.fo = ${maven.build.dir}/generated-docbooks/fo
maven.sdocbook.generated.pdf = ${maven.build.dir}/generated-docbooks/pdf

maven.sdocbook.target.dir = ${maven.build.dir}/docs/docbook

# the root dir of the stylesheet to use (defaults to plugin-internal version)
maven.sdocbook.stylesheets.dir = ${plugin.dir}/plugin-resources

# the resources which are to be copied from maven.sdocbook.src.dir
maven.sdocbook.resources.include = **/*.png, **/*.gif

# can be set to the "-param ..." which user can use to parameterize the html stylesheets
maven.sdocbook.html.params =

# can be set to the "-param ..." which user can use to parameterize the fo stylesheets
maven.sdocbook.fo.params =


# set this to true if you want to use xml-commons-resolver for resolving the dtd elements
maven.sdocbook.use.entityresolver=false

# Set to point to configuration file of xml-commons-resolver
# (NOTE: if you set "maven.sdocbook.use.entityresolver" to true, you must set this too)
maven.sdocbook.catalogmanager.properties=

