Как защитить автоматически генерируемые источники во время чистой упаковки в Maven?
У меня есть файл конфигурации Maven, который запускает автогенерацию xsd
а также wsdl
Классы следующим образом:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>${cxf-xjc-plugin}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/src/main/java</sourceRoot>
<xsdOptions>
//xsds, wsdls etc
</xsdOptions>
</configuration>
<goals>
<goal>xsdtojava</goal>
</goals>
</execution>
</executions>
</plugin>
Сгенерированные классы идут в: target/generated/src/main/java
,
Проблема: запуск mvn clean package всегда удалит эти классы. Как я могу предотвратить это? Возможно ли иметь clean
удалить полное содержание target
каталог, кроме generated/
один?
2 ответа
Можно не удалять какой-либо каталог, используя maven-clean-plugin
но это определенно не очень хорошая идея
- это идет вразрез с конвенциями Maven
- это заставляет вас менять свой POM каждый раз, когда вы хотите, чтобы эти классы были сгенерированы
Решение вашего точного вопроса (НЕ РЕКОМЕНДУЕТСЯ)
Вы можете исключить каталоги с помощью maven-clean-plugin
с помощью excludeDefaultDirectories
а также filesets
параметры:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.6.1</version>
<configuration>
<excludeDefaultDirectories>true</excludeDefaultDirectories>
<filesets>
<fileset>
<directory>${project.build.directory}</directory>
<excludes>
<exclude>generated/*</exclude>
</excludes>
</fileset>
</filesets>
</configuration>
</plugin>
Обратите внимание, что я настоятельно призываю вас НЕ использовать это решение.
Предложенное решение
Ваша настоящая проблема не в том, чтобы заново генерировать классы каждый раз, когда вы создаете, потому что это занимает много времени. Цель состоит в том, чтобы избежать генерации с помощью пользовательского профиля:
<profiles>
<profile>
<id>noGenerate</id>
<properties>
<xjc.generate>none</xjc.generate>
</properties>
</profile>
<profile>
<id>generate</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<xjc.generate>generate-sources</xjc.generate>
</properties>
</profile>
</profiles>
Со следующим определением плагина:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>${cxf-xjc-plugin}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>${xjc.generate}</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/src/main/java</sourceRoot>
<xsdOptions>
//xsds, wsdls etc
</xsdOptions>
</configuration>
<goals>
<goal>xsdtojava</goal>
</goals>
</execution>
</executions>
</plugin>
Похоже на то cxf-xjc-plugin
не имеет никакого skip
параметр, поэтому мы должны прибегнуть к установке phase
в none
когда мы хотим избежать выполнения (это недокументированная функция, но она работает).
Хитрость заключается в том, чтобы определить два профиля: один, активированный по умолчанию, устанавливает свойство, сообщающее cxf-xjc-plugin
выполнить в generate-soures
фаза, в то время как другой устанавливает свойство, говорящее cxf-xjc-plugin
не выполнить.
Таким образом, когда вы хотите, чтобы классы генерировались, вы можете вызывать Maven с mvn clean install
и когда вы хотите, чтобы классы не генерировались, вы можете вызвать Maven с помощью mvn clean install -PnoGenerate
,
Реальная выгода и преимущество в том, что вам не нужно менять POM каждый раз, когда вы решаете создавать классы или нет.
У меня был бы другой подход.
1. Настройте ваш плагин xjc так, чтобы он не удалял файлы, например:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<clearOutputDir>false</clearOutputDir>
<outputDirectory>${project.build.directory}</outputDirectory>
<sources>
<source> [any xsd] </source>
</sources>
</configuration>
2) Используйте maven-clean-plugin для очистки сгенерированного dx класса jxc на чистой стадии:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}/generated/src/main/java/...where the generated classes are</directory>
<includes>
<include>**/*.java</include>
</includes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
Это работает для меня, и я надеюсь, будет полезно.