#   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.junit.fork=true

maven.compile.deprecation = on

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

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

maven.license.licenseFile=${basedir}/../../LICENSE.txt

maven.xdoc.date=left
maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html
maven.xdoc.poweredby.image=maven-feather.png

maven.xdoc.jsl=file:${basedir}/../../../commons-build/commons-site.jsl
maven.xdoc.distributionUrl=http://www.apache.org/dist/java-repository/commons-jelly/jars

maven.linkcheck.enable=false
maven.pmd.rulesetfiles=\
  rulesets/basic.xml,\
  rulesets/unusedcode.xml,\
  rulesets/imports.xml,\
  rulesets/codesize.xml,\
  rulesets/coupling.xml,\
  rulesets/design.xml,\
  rulesets/strings.xml

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