Порядок выполнения плагинов Maven и связывание классов
Я бился головой с порядком выполнения плагинов maven и упаковкой сгенерированных классов.
У меня есть требование генерировать pojos из XSD с аннотацией, и для этого я использую maven-jaxb2-plugin, который использует файл binding.xjb (xml-файл, содержащий полностью классифицированные имена полей, который нужно аннотировать) и добавляю аннотации к сгенерированные pojos. Наряду с этим у меня есть механизм для динамического создания файла binding.xjb из файла сопоставления, цель которого состоит в том, чтобы просто обеспечить сопоставление в формате файла yaml, вместо того, чтобы иметь большой связывание. Xjb, потому что для этого легко поддерживать файл yml, для этого У меня есть отдельное весеннее загрузочное приложение, которое читает файл yaml и генерирует файл binding.xjb, и я использую exec-maven-plugin для вызова моего приложения перед maven-jaxb2-plugin, так что binding.xjb генерируется заранее и может быть используется maven-jaxb2-plugin для комментирования pojos.
И я знаю, что для поддержания порядка выполнения плагинов они должны быть объявлены на одной и той же фазе, чтобы избежать хлопот, я использую фазу классов процессов, и с помощью этого pojos генерируются с аннотацией.
Но проблема в том, что сгенерированные классы не упакованы в jar, и я хотел бы исключить мою логику генерации binding.xjb из сгенерированного файла jar.
Моя конфигурация сборки выглядит следующим образом:
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.abc.GeneratorApp</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>${maven-jaxb2-plugin.version}</version>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-XautoNameResolution</arg>
<arg>-Xannotate</arg>
</args>
<schemas>
<schema>
<fileset>
<directory>src/main/xsd</directory>
<includes>
<include>PATH-TO-XSD/my.xsd</include>
</includes>
</fileset>
</schema>
</schemas>
<bindings>
<binding>
<fileset>
<directory>src/main/xsd</directory>
<includes>
<include>*.xjb</include>
</includes>
</fileset>
</binding>
</bindings>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.4</version>
</plugin>
<plugin>
<groupId>com.abc.xyz</groupId>
<artifactId>my-api</artifactId>
<version>1.2.3</version>
</plugin>
</plugins>
</configuration>
</plugin>
</plugins>
Может кто-то, пожалуйста, укажет мне на ошибку, которую я делаю, или предоставит предложение для решения этой проблемы, спасибо заранее.
1 ответ
Генерация кода обычно выполняется в generate-sources
фаза. Не уверен, почему ты предпочитаешь process-classes
,
Порядок плагинов в той же фазе должен фактически быть порядком, в котором они перечислены в pom.xml
, Так exec-maven-plugin
должно быть выполнено до maven-jaxb2-plugin
, В ранних версиях Maven 3 с этим была ошибка, которая должна была быть исправлена в 3.0.3+.
Если ничего не помогает, двигайтесь exec-maven-plugin
на более раннем этапе, как generate-sources
а также maven-jaxb2-plugin
в process-sources
,