Как защитить автоматически генерируемые источники во время чистой упаковки в 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>

Это работает для меня, и я надеюсь, будет полезно.

Другие вопросы по тегам