Создание новых источников с помощью плагина Maven после фазы компиляции - PullRequest
5 голосов
/ 04 января 2011

У меня есть проект Maven, в котором мне нужно выполнить два шага генерации кода. Один генерирует несколько типов Java, затем второй зависит от этих типов Java, чтобы генерировать еще немного кода. Есть ли способ выполнить оба эти шага во время моей сборки?

На данный момент мои шаги:

  1. выполнить первый плагин генерации кода (во время generate-sources)
  2. добавить каталог сгенерированных типов для построения пути
  3. выполнить второй плагин генерации кода (во время compile)

Однако моя проблема в том, что что-либо, сгенерированное вторым плагином генерации кода, не будет скомпилировано (потому что фаза компиляции закончилась). Если я присоединяю второй плагин генерации кода к более ранней фазе, он завершается сбоем, потому что ему нужны классы из первого плагина генерации кода, присутствующие в пути к классам.

Я знаю, что мог бы разделить это на два модуля, один из которых зависел от другого , но мне было интересно, можно ли этого достичь за один раз. Кажется, нужен способ снова вызвать компиляцию после завершения нормальной фазы компиляции.

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 04 января 2011

Вы всегда можете настроить два исполнения плагина компилятора, оба связаны с фазой компиляции.В один из них вы включаете дополнительный материал:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.3.2</version>
  <executions>
    <execution>
      <id>one</id>
      <phase>compile</phase>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration></configuration>
    </execution>  
    <execution>
      <id>two</id>
      <phase>compile</phase>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration>
      <compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument>
      </configuration>
    </execution>
  </executions>
<plugin>

Вы также можете попробовать <includes><include>path/</include></includes>

Согласно официальной документации :

Когда даны несколько исполнений, которые соответствуют определенной фазе, они выполняются в порядке, указанном в POM, причем первыми выполняются унаследованные исполнения.

Но я совсем не понимаю, что именно вы хотите.http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

3 голосов
/ 04 января 2011

Очевидное решение (генерировать код после фазы компиляции) не работает, поскольку Maven не позволяет переупорядочивать фазы.

Правильным решением является использование модулей . Вам нужно два: первый модуль содержит генератор кода. Во втором модуле вы можете использовать генератор из первого модуля для генерации чего-либо в фазе generate-sources.

Большое преимущество этого подхода: вы никогда не попадете в какой-то цикл (например, «A» нужен сгенерированный код, который требует «A»). Таким образом, ваша сборка будет более простой, и вы будете тратить меньше времени на поиск странных ошибок.

[ОБНОВЛЕНИЕ] В моих проектах я запускаю генератор кода из тестов. Без специальной опции файлы генерируются во временную папку и сравниваются с источниками. Это позволяет мне видеть неожиданные изменения в сгенерированном коде (, который я помещаю под контроль версий ).

Когда установлено системное свойство, исходные файлы перезаписываются, и я могу зафиксировать изменения в моей VCS.

...