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, см. ниже правку). Учитывая приведенное выше описание, обходной путь заключается в следующем:
Временно переопределите вышеуказанные свойства, чтобы они указывали на что-то отличное от значения по умолчанию
target
каталог, перед очисткой каталогов.Использовать
filesets
механизм, чтобы сказать, какие каталоги исключать изtarget
каталог (так же, как вы уже сделали).Восстановите свойства после очистки каталогов.
pre-clean
а также post-clean
фазы жизненного цикла могут быть использованы для выполнения шагов 1 и 3.
РЕДАКТИРОВАТЬ: (спасибо nullpointer за указание на это)
Установка параметра цели excludeDefaultDirectories
Значение true исключит каталог по умолчанию от удаления, и в этом случае вы можете использовать filesets
подход без взлома переопределения свойств Maven.
Согласно комментарию @Christian, это решение использует профиль, чтобы определить, разрешить ли maven-clean удалить исключенную папку (и подпапки с/**
). В моем случае процесс генерирует исходные файлы парсера вtarget/generated-sources
до компиляции. Обычно я хочу сохранить их, чтобы сэкономить время. Я также ленив (как и большинство из нас, разработчиков) и не люблю печатать. Команды для сборки проекта:
- Профиль неактивен, оставьте исходный код парсера:
mvn clean install
- Профиль активирован, действительно, действительно чистый:
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>