<?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 id="FAQ" title="Frequently Asked Questions">
  <part id="General">
    <faq id="I already ran mvn clean but the directory (put dir name here) is still there. What should I do?">
      <question>I already ran <i>mvn clean</i> but the directory (<i>put dir name here</i>) is still there. What should I do?</question>
      <answer>
        <p>
          Some files-generating plugins can generate their files outside of the
          default directories being deleted by the clean plugin. You should add
          the location of such files in the clean plugin configuration or change
          the configuration of those plugins to put their files inside the
          <i>project.build.directory</i> which is by default, the <i>target</i>
          directory.
        </p>
      </answer>
    </faq>
    <faq id="On Windows, I got Unable to delete directory. What s wrong?">
      <question>On Windows, I got <i>"Unable to delete directory"</i>. What's wrong?</question>
      <answer>
        <p>
          For instance, <i>clean</i> could fail if you already have opened a command
          line with target as the current dir. Windows locks some ressources and you need
          to close the handles on these ressources.
          To skip these errors, you could call <i>clean</i> with the command line parameter <i>-Dmaven.clean.failOnError=false</i>.
          For more information, refer to <a href="./examples/ignoring-errors.html">Ignoring Errors</a> page.
        </p>
        <p>
          <a href="http://www.microsoft.com/technet/sysinternals/default.mspx">Sysinternals</a> produced
          a number of utilities, like <a href="http://www.microsoft.com/technet/sysinternals/Utilities/ProcessExplorer.mspx">Process Explorer</a>
          or <a href="http://www.microsoft.com/technet/sysinternals/utilities/handle.mspx">Handle</a>
          that help you to deal with Windows handles.
        </p>
      </answer>
    </faq>
  </part>
</faqs>