【问题标题】:Maven Clean: excluding directory inside target from being deletedMaven Clean:排除目标内的目录被删除
【发布时间】:2017-04-22 19:18:45
【问题描述】:

我尝试了许多变体,但无法完成这项工作。一个例子(孩子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 总是试图删除我的文件夹。为什么?

【问题讨论】:

    标签: maven maven-clean-plugin


    【解决方案1】:

    来自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. 在清理目录后恢复属性

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

    编辑:(感谢 nullpointer 指出)

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

    【讨论】:

    • 好吧,我想在您共享的同一个链接上有一个解决方法。谢谢。 :)
    • @nullpointer 实际上我完全错过了excludeDefaultDirectories 参数。谢谢。
    【解决方案2】:

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

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

    不过,如果您想排除特定文件被删除,您可以按照相反的方法(一个简单的 hack)进行如下操作 -

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

    更多关于excludeDefaultDirectories 的信息来自similar link -

    禁用删除配置的默认输出目录 一个专案。 如果设置为 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>
    

    【讨论】:

    • 谢谢。我可以使用以下命令直接使其工作: truetarget**myFolder
    • @ftkg - 确实。请随时编辑答案以更新所使用的确切正则表达式。
    • 我是 maven 新手,如果我问的很明显,请道歉......鉴于上面的第二个解决方案,有没有办法只在将标志传递给 maven 时跳过清理内容,比如-DskipCleaningMyStuff=true(默认为false(即默认全部清除)?
    猜你喜欢
    • 2017-06-08
    • 2018-05-28
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多