#   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 

######################################################################
# Make the source distro unzip to a different directory
######################################################################
maven.dist.src.assembly.dir=${maven.dist.assembly.dir}/src/${maven.final.name}-src


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

