<?xml version="1.0" encoding="UTF-8"?>

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


<faqs xmlns="http://maven.apache.org/FML/1.0.1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/FML/1.0.1 http://maven.apache.org/xsd/fml-1.0.1.xsd"
  id="FAQ" title="Frequently Asked Questions">
  <part id="General">
    <faq id="Is there any way to skip the PMD or CPD reports temporarily">
      <question>
        The PMD report takes a long time to generate. Is there any way to skip
        the PMD or CPD reports temporarily?
      </question>
      <answer>
        <p>
          Yes, each report supports a skip parameter which you can pass on the
          command line, <code>-Dpmd.skip=true</code> and
          <code>-Dcpd.skip=true</code> respectively.
        </p>
      </answer>
    </faq>
    <faq id="xref_links">
      <question>
        How can I generate links to the JXR cross-referenced source?
      </question>
      <answer>
        <p>
          First make sure that the <a href="pmd-mojo.html#linkXRef">linkXRef</a> parameter is configured
          correctly (it is switched on by default).
        </p>
        <p>
          Then, the jxr plugin has to run first so that the links can be picked up by the pmd report.
          If you run from the command line, use <code>mvn jxr:jxr pmd:pmd</code>, or if you want the
          reports generated by the site plugin, configure the jxr plugin in your reporting section, see
          <a href="http://maven.apache.org/plugins/maven-jxr-plugin/usage.html">JXR usage</a>.
        </p>
      </answer>
    </faq>
    <faq id="no report in site">
      <question>
        I have add the PMD/CPD reports, but they do not show up in the generated site. Has the plugin been executed?
      </question>
      <answer>
        <p>
          If there are no violations, then by default no reports are created and the entire PMD or CPD section
          is not rendered in the site. To change this behaviour, set the
          <a href="pmd-mojo.xml#skipEmptyReport">skipEmptyReport for PMD</a> or <a href="cpd-mojo#skipEmptyReport">skipEmptyReport for CPD</a>
          to <code>false</code>.
        </p>
      </answer>
    </faq>
    <faq id="violations failures warnings">
        <question>
          What's the difference between violations, failures and warnings and when is a build failing?
        </question>
        <answer>
          <p>
            PMD reports violations. These violations originate from rules - the rules, that are enabled in the
            configured ruleset (see property <a href="pmd-mojo.html#rulesets">rulesets</a>). Each rule has a assigned
            priority (1 - high, 2 - medium-high, 3 - medium, 4 - medium-low, 5 - low). This priority is also used
            for the violation.
          </p>
          <p>
            Violations with a high enough priority can fail the build when using the <a href="check-mojo.html">check</a> goal.
            These violations are called "failures". The exact priority, when to fail the build, is configured via the property
            <a href="check-mojo.html#failurePriority">failurePriority</a>.
          </p>
          <p>
            Violations, that have a priority too low to fail the build, are called "warnings". These warnings appear
            in the report and are displayed in the build output, if the property <a href="check-mojo.html#verbose">verbose</a>
            is enabled.
          </p>
          <p>
            With the property <a href="check-mojo.html#failOnViolation">failOnViolation</a> the build failure
            can be entirely disabled. This is most useful at command line with <code>-Dpmd.failOnViolation=false</code>.
          </p>
          <p>
            With the property <a href="check-mojo.html#maxAllowedViolations">maxAllowedViolations</a> one can configure
            how many failures are allowed, before the build is failed.
          </p>
        </answer>
    </faq>
  </part>
</faqs>