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

# -------------------------------------------------------------------
# P R O J E C T  P R O P E R T I E S
# -------------------------------------------------------------------

maven.repo.remote=http://repo1.maven.org/maven

maven.junit.fork=true
maven.compile.fork=true

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

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

maven.jellydoc.packages=org.apache.commons.jelly.tags.core.*
maven.announcement.lenient=true

maven.junit.usefile = false

# copied from maven test plugin due to a bug/caching issue
maven.test.dest = ${maven.build.dir}/test-classes
 
# Installation dir
maven.dist.install.dir = /usr/local/jelly

maven.changes.issue.template=http://issues.apache.org/jira/browse/%ISSUE%

#maven.xdoc.jsl=../commons-build/commons-site.jsl
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}
maven.xdoc.developmentProcessUrl=http://commons.apache.org/charter.html
maven.xdoc.poweredby.image =maven-feather.png
maven.xdoc.distributionUrl=http://www.apache.org/dist/java-repository/commons-jelly/jars

apache.cvs=pserver:anoncvs@people.apache.org:/home/cvspublic

# TODO: FIXME!
maven.multiproject.excludes=jelly-tags/avalon/project.xml
maven.multiproject.includes=jelly-tags/*/project.xml
maven.multiproject.navigation=independent
maven.multiproject.overviewPage.title=Jelly Libraries
maven.multiproject.overviewPage.text=The following libraries are available for Jelly as part of the standard distribution. Other libraries are maintained elsewhere - please see the <a href="../powered.html">powered by</a> page for more details.

maven.linkcheck.enable=false

maven.checkstyle.properties=jelly-tags/tag-checkstyle.xml
maven.checkstyle.header.file=${basedir}/short-license.txt
maven.license.licenseFile=${basedir}/LICENSE.txt

maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory

# Repository to deploy to
maven.repo.list=apache.snapshots

maven.repo.apache.releases=scp://people.apache.org
maven.repo.apache.releases.directory=/www/www.apache.org/dist/java-repository
# These must be set elsewhere
#maven.repo.apache.releases.username=
#maven.repo.apache.releases.privatekey=
#maven.repo.apache.releases.passphrase=

# Repository to deploy snapshots
maven.repo.apache.snapshots=scp://people.apache.org
maven.repo.apache.snapshots.directory=/www/people.apache.org/repository
maven.repo.apache.snapshots.username=${maven.repo.apache.releases.username}
maven.repo.apache.snapshots.privatekey=${maven.repo.apache.releases.privatekey}
maven.repo.apache.snapshots.passphrase=${maven.repo.apache.releases.passphrase}

maven.scm.svn.tag.base=https://svn.apache.org/repos/asf/commons/proper/jelly/tags

maven.dist.src.assembly.dir=${maven.dist.assembly.dir}/src/${maven.final.name}-src
