Понимание жизненного цикла Maven
У меня есть JavaEE, приложение Maven. В этом приложении я использую классы, сгенерированные из XSD, и картографы через Mapstruct.
В моем модуле EJB сборка maven должна делать следующее:
- генерировать Java-классы из XSD с помощью jaxb2-maven-plugin
- Добавьте эти сгенерированные классы в папку исходников с помощьюbuild-helper-maven-plugin, потому что:
- maven-processor-plugin генерирует реализации Mapstruct mapper с помощью generate-mapstruct-mappers, которые используют эти сгенерированные классы XSD
- наконец, добавьте эти реализации 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 можно найти здесь.