 ------
 Delete Additional Files Not Exposed to Maven
 ------
 Mike Perham
 <mperham@apache.org>
 ------
 2007-11-14
 ------

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

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Delete Additional Files Not Exposed to Maven

  The Maven Clean Plugin will delete the <<<target>>> directory by default.  You may configure
  it to delete additional directories and files.  The following example shows how:

+--------
<build>
  [...]
  <plugin>
    <artifactId>maven-clean-plugin</artifactId>
    <version>${project.version}</version>
    <configuration>
      <filesets>
        <fileset>
          <directory>some/relative/path</directory>
          <includes>
            <include>**/*.tmp</include>
            <include>**/*.log</include>
          </includes>
          <excludes>
            <exclude>**/important.log</exclude>
            <exclude>**/another-important.log</exclude>
          </excludes>
          <followSymlinks>false</followSymlinks>
        </fileset>
      </filesets>
    </configuration>
  </plugin>
  [...]
</build>
+---------

 <<Note:>> The <<<directory>>> in the <<<fileset>>> is a relative path inside a project, in other words,

+--------
  <directory>some/relative/path</directory>
+--------

 is equivalent to:

+--------
  <directory>${basedir}/some/relative/path</directory>
+--------

 You could also define file set rules in a parent POM. In this case, the clean plugin adds the subproject
 basedir to the defined relative path.

 <<Note:>> The <<<fast>>> delete method will not work for any <<<fileset>>> which defines any <<<includes>>>
 or <<<excludes>>>, or sets <<<followSymlinks>>> to <<<false>>>, or sets <<<useDefaultExcludes>>> to <<<true>>>.