Maven Clean: исключение каталога внутри цели из удаления

Я перепробовал много вариантов, но не смог сделать эту работу. Один пример (ребенок пом):

<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 всегда пытается удалить мою папку. Зачем?

3 ответа

Решение

Как также предложено @AR.3 в ответе здесь, 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>

Больше о 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>

Из документации clean:clean цель:

Это пытается очистить рабочий каталог проекта от файлов, которые были сгенерированы во время сборки. По умолчанию он обнаруживает и удаляет каталоги, настроенные в project.build.directory, project.build.outputDirectory, project.build.testOutputDirectory, а также project.reporting.outputDirectory,

Файлы за пределами по умолчанию также могут быть включены в удаление путем настройки filesets тег.

Это означает, что все, что вы объявляете в filesets элемент, target каталог всегда будет удален excludeDefaultDirectories установлено в true, см. ниже правку). Учитывая приведенное выше описание, обходной путь заключается в следующем:

  1. Временно переопределите вышеуказанные свойства, чтобы они указывали на что-то отличное от значения по умолчанию target каталог, перед очисткой каталогов.

  2. Использовать filesets механизм, чтобы сказать, какие каталоги исключать из target каталог (так же, как вы уже сделали).

  3. Восстановите свойства после очистки каталогов.

pre-clean а также post-clean фазы жизненного цикла могут быть использованы для выполнения шагов 1 и 3.

РЕДАКТИРОВАТЬ: (спасибо nullpointer за указание на это)

Установка параметра цели excludeDefaultDirectories Значение true исключит каталог по умолчанию от удаления, и в этом случае вы можете использовать filesets подход без взлома переопределения свойств Maven.

Согласно комментарию @Christian, это решение использует профиль, чтобы определить, разрешить ли maven-clean удалить исключенную папку (и подпапки с/**). В моем случае процесс генерирует исходные файлы парсера вtarget/generated-sourcesдо компиляции. Обычно я хочу сохранить их, чтобы сэкономить время. Я также ленив (как и большинство из нас, разработчиков) и не люблю печатать. Команды для сборки проекта:

  1. Профиль неактивен, оставьте исходный код парсера:mvn clean install
  2. Профиль активирован, действительно, действительно чистый:mvn clean install delete-parsers

Код:

      <properties>
    <!-- By default, clean will skip the parser source files
         generated in this folder and its subfolders.  -->
    <skip.parser.source>generated-sources/**</skip.parser.source>
</properties>

<profiles>
    <!-- Activate this profile to delete parser sources. -->
    <profile>
        <id>delete-parsers</id>
        <!-- Setting this property to null removes the exclusion 
             in maven-clean.  -->
        <properties>
            <skip.parser.source />
        </properties>
    </profile>
</profiles>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<configuration>
    <!-- Required so maven standard folders won't be deleted. -->
    <excludeDefaultDirectories>true</excludeDefaultDirectories>
    <filesets>
        <fileset>
            <!-- Delete everything in target/** -->
            <directory>target</directory>
            <includes>
                <include>**</include>
            </includes>
            <!-- But NOT this folder when the profile is activated. -->
            <excludes>
                <exclude>${skip.parser.source}</exclude>
            </excludes>
        </fileset>
    </filesets>
</configuration>
Другие вопросы по тегам