#   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$
######################################################################
#maven.repo.remote=http://www.ibiblio.org,http://maven-plugins.sf.net/maven
maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory
maven.changes.issue.template=%URL%/browse/%ISSUE% 
maven.changelog.range=365

maven.compile.source=1.3
maven.compile.target=1.3

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

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

######################################################################
# Jar Manifest Additional Attributes
######################################################################
maven.jar.manifest.attributes.list=Implementation-Vendor-Id,X-Compile-Source-JDK,X-Compile-Target-JDK
maven.jar.manifest.attribute.Implementation-Vendor-Id=org.apache
maven.jar.manifest.attribute.X-Compile-Source-JDK=${maven.compile.source}
maven.jar.manifest.attribute.X-Compile-Target-JDK=${maven.compile.target}


######################################################################
# 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.date=left
maven.xdoc.poweredby.image=maven-feather.png
maven.xdoc.version=${pom.currentVersion}
maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html
maven.xdoc.includeProjectDocumentation=yes


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

