# 
# Copyright 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.
#
#
# Display the date on the Maven web site
maven.xdoc.date = left

# Display the maven version the web site is documenting
maven.xdoc.version = ${pom.currentVersion}

maven.compile.deprecation=on

maven.junit.fork = true

maven.checkstyle.header.file = ${basedir}/../LICENSE.TXT
maven.license.licenseFile=${basedir}/../LICENSE.TXT

maven.multiproject.type=war

maven.checkstyle.format=turbine

maven.tomcat.host=localhost
maven.tomcat.context.config=src/conf/pluto.xml
maven.tomcat.deploy=exploded
