Понимание жизненного цикла Maven

У меня есть JavaEE, приложение Maven. В этом приложении я использую классы, сгенерированные из XSD, и картографы через Mapstruct.

В моем модуле EJB сборка maven должна делать следующее:

  1. генерировать Java-классы из XSD с помощью jaxb2-maven-plugin
  2. Добавьте эти сгенерированные классы в папку исходников с помощьюbuild-helper-maven-plugin, потому что:
  3. maven-processor-plugin генерирует реализации Mapstruct mapper с помощью generate-mapstruct-mappers, которые используют эти сгенерированные классы XSD
  4. наконец, добавьте эти реализации Mapper в папку источников также

К сожалению, это не работает для меня. Это часть плагинов ejb-файла pom.xml:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>${version.jaxb2-maven-plugin}</version>
    <executions>
        <execution>
            <id>xjc</id>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
        <packageName>com.my.project</packageName>
        <catalog>src/main/resources/xsd/CustomCatalog.xml</catalog>
        <xjbSources>
            <xjbSource>${project.basedir}/src/main/resources/jaxb2/</xjbSource>
        </xjbSources>
        <sources>
           <source>${project.basedir}/src/main/resources/xsd/applications/MyNewClass.xsd</source>
       </sources>
       <xsdPathWithinArtifact>my/source/xsds</xsdPathWithinArtifact>
    </configuration>
</plugin>
<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <configuration>
        <defaultOutputDirectory>
            ${project.build.directory}/generated-sources
        </defaultOutputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>generate-mapstruct-mappers</id>
            <phase>compile</phase>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <processors>
                    <processor>org.mapstruct.ap.MappingProcessor</processor>
                </processors>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${version.mapstruct}</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${version.mapstruct}</version>
        </dependency>
    </dependencies>
</plugin>
<!-- attach sources -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>compile</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

Это генерирует классы из JAXB и помещает их в исходные коды файла JAR. Но сгенерированные реализации Mapper отсутствуют в источниках.

В eclipse я могу установить сгенерированные классы как часть пути сборки, но сгенерированный JAR не содержит mapperimplementations.

Если я изменю фазу плагинов, плагин maven-processor-plugin выдаст сообщение о невозможности найти символ ОШИБКИ, а символом будет сгенерированный класс из jaxb.

Спасибо за помощь.

1 ответ

Насколько я понимаю, желаемый поток будет следующим:

  • Генерация классов из XSD
  • Добавьте их как источники (через помощника Builder)
  • Генерация картографов из MapStruct (для этого требуются классы из XSD)
  • Добавьте их как источники (через помощника Builder)
  • скомпилировать все

Следовательно, вы можете попытаться:

  • установить выполнение jaxb2-maven-plugin для фазы generate-sources
  • установить первое выполнение build-helper-maven-plugin для фазы generate-sources (который должен добавить классы из XSD в качестве источников)
  • установите выполнение генерации преобразователей в фазу process-sources (которая должна найти классы XSD в качестве источников), но объявите это после записи build-helper-maven-plugin
  • установить второй запуск build-helper-maven-plugin для фазы process-sources, которая должна добавить мапперы в качестве источников

Чтобы лучше прояснить это: два исполнения build-helper-maven-plugin в двух разных фазах для двух разных сгенерированных источников. Также лучше указать две разные папки для каждого сгенерированного источника (т.е. generate-sources-xsd а также generated-sources-mappers). В вашем pom следуйте порядку объявления: плагин jaxb2, плагин mappers, плагин build helper.

Ниже возможный пример:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.1</version>
    <executions>
        <execution>
            <id>xjc</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/generated-sources-xsd</outputDirectory>
        <packageName>com.my.project</packageName>
        <catalog>src/main/resources/xsd/CustomCatalog.xml</catalog>
        <xjbSources>
            <xjbSource>${project.basedir}/src/main/resources/jaxb2/</xjbSource>
        </xjbSources>
        <sources>
            <source>${project.basedir}/src/main/resources/xsd/applications/MyNewClass.xsd</source>
        </sources>
        <xsdPathWithinArtifact>my/source/xsds</xsdPathWithinArtifact>
    </configuration>
</plugin>
<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <version>2.2.4</version>
    <configuration>
        <defaultOutputDirectory>
            ${project.build.directory}/generated-sources-mappers
        </defaultOutputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>generate-mapstruct-mappers</id>
            <phase>process-sources</phase>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <processors>
                    <processor>org.mapstruct.ap.MappingProcessor</processor>
                </processors>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
    </dependencies>
</plugin>
<!-- attach sources -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9</version>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources-xsd</source>
                </sources>
            </configuration>
        </execution>
        <execution>
            <id>add-source2</id>
            <phase>process-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources-mappers</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

Примечание: в приведенном выше фрагменте мне пришлось добавить несколько версий, чтобы заставить его работать.

Полный список этапов жизненного цикла Maven можно найти здесь.

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