Maven Clean:删除目标内的目录

时间:2016-12-07 18:07:59

标签: maven maven-clean-plugin

我尝试了很多变种,但无法使其发挥作用。一个例子(孩子pom.xml):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-clean-plugin</artifactId>
    <configuration>
        <filesets>
            <fileset>
                <directory>target</directory>
                <useDefaultExcludes>true</useDefaultExcludes>
                <excludes>
                    <exclude>myFolder</exclude>
                </excludes>
            </fileset>
        </filesets>
    </configuration>
</plugin>

Maven总是试图删除我的文件夹。为什么呢?

2 个答案:

答案 0 :(得分:9)

正如@ AR.3在答案here中所建议的那样,clean阶段和目标会 -

  

默认情况下,它会发现并删除配置的目录   project.build.directory,project.build.outputDirectory,   project.build.testOutputDirectory,和   project.reporting.outputDirectory。

但是,如果你想排除一个特定的文件被删除,你可以按照以下方法(一个简单的黑客)进行操作,如下所示 -

<plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-clean-plugin</artifactId>
       <version>3.0.0</version>
       <configuration>
           <excludeDefaultDirectories>true</excludeDefaultDirectories>
           <filesets>
                <fileset>
                    <directory>target</directory>
                    <followSymlinks>false</followSymlinks>
                    <useDefaultExcludes>true</useDefaultExcludes>
                    <includes>
                          <include><!--everything other that what you want to exclude--></include>
                    </includes>
                 </fileset>
            </filesets>
        </configuration>
</plugin>

有关similar link -

excludeDefaultDirectories的更多信息
  

禁用删除为其配置的默认输出目录   一个专案。 如果设置为true,则只选择通过的文件/目录   参数文件集将被删除

修改

确实可以使用直接方法排除特定文件:

<configuration>
    <excludeDefaultDirectories>true</excludeDefaultDirectories>
        <filesets>
            <fileset>
                <directory>target</directory>
                <includes>
                    <include>**</include>
                </includes>
                <excludes>
                    <exclude><!-- folder you want to exclude --></exclude>
                </excludes>
            </fileset>
        </filesets>
</configuration>

答案 1 :(得分:3)

来自documentation of the clean:clean goal

  

这会尝试清除项目在构建时生成的文件的工作目录。默认情况下,它会发现并删除project.build.directoryproject.build.outputDirectoryproject.build.testOutputDirectoryproject.reporting.outputDirectory中配置的目录。

     

默认情况下的文件也可能通过配置filesets代码包含在删除中。

这意味着,无论您在filesets元素中声明什么,target目录将始终被删除(编辑,除非excludeDefaultDirectories设置为true,请参阅下面编辑)。鉴于以上描述,解决方法是执行以下操作:

  1. 在清理目录之前,暂时覆盖上述属性以指向默认target目录以外的其他属性。

  2. 使用filesets机制告知要从target目录中排除哪些目录(与您已经执行的目录相同)。

  3. 清理目录后恢复属性

  4. pre-cleanpost-clean生命周期阶段可用于执行第1步和第3步。

    编辑:(感谢nullpointer指出它)

    将目标参数excludeDefaultDirectories设置为true将排除默认目录被删除,在这种情况下,您可以使用filesets方法而不会覆盖Maven属性。