Как игнорировать исходный каталог Java во время компиляции Maven?


Я пытаюсь использовать плагин Lombok Maven для обеспечения правильного создания Javadoc при использовании Lombok.

Lombok Maven вводит новую цель генерации кода непосредственно перед компиляцией. В моей конфигурации мой sourceDirectory (Java с аннотациями Lombok, src/main/java) обрабатывается для создания Java (без аннотаций Lombok) в target/generated-sources/delombok.

Однако каждый файл в sourceDirectory теперь имеет соответствующий (с одинаковым именем) файл в target/generated-sources/delombok, что приводит к сбоям компиляции из-за повторяющихся классов.

Как я могу сказать компилятору Java игнорировать источники в sourceDirectory?

Обратите внимание, что в конфигурации Lombok Maven по умолчанию разработчик помещает Java (с аннотациями Lombok) в папку src/main/lombok вместо src/main/java. Однако я не хочу этого делать, потому что это путает IDEs и мой код компилируется просто отлично (если я удалю плагин Maven).

Также обратите внимание, что простое переопределение sourceDirectory также расстроит IDEs (они больше не знают, куда идти найдите исходный код Java!).

4 20

4 ответа:

Недавно я перешел от использования подхода flakey maven-exec-plugin для генерации исходных текстов для инструмента javadoc к использованию lombok-maven-plugin

Моя настройка

  • все источники в src/main/java
  • генерируемые источники идут в target/generated-sources/delombok

Я изначально столкнулся с этой проблемой, но это, кажется, легко исправить: Не позволяйте Lombok-maven-plugin добавлять путь delombok в исходные пути компилятора с помощью addOutputDirectoy. IE

<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>0.11.2.0</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>delombok</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <addOutputDirectory>false</addOutputDirectory>
        <sourceDirectory>src/main/java</sourceDirectory>
    </configuration>
</plugin>

Это, кажется, решило проблему для теперь

EDIT: Бонус, как генерировать правильные javadocs с этой установкой

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.8.1</version>
    <configuration>
        <defaultVersion>${project.version}</defaultVersion>
        <sourcepath>target/generated-sources/delombok</sourcepath>
    </configuration>
</plugin>

Создайте новый профиль Maven, и в новом профиле просто переопределите источники:

<sourceDirectory>target/generated-sources/delombok</sourceDirectory>

Альтернативно

  1. Build helper: естьbuild helper , который, кажется, обеспечивает эту функциональность, но я не использовал это раньше.
  2. Хак: есть Хак , описанный здесь , но автор рекомендует не делать этого, и кроме того: если вы собираетесь потратить время, чтобы изменить свой POM и создать этот хак, вы можете также делать вещи, которые вы хотите сделать. Правильный путь и реализовать профиль.

Цель delombok предназначена для преобразования кода java из src/main/lombok в target/generated-source/delombok. Затем другой код java, найденный в src/main/java, объединяется с target/generated-source/delombok для получения Объединенных классов java.

Это помогает думать о деломбоке как о генераторе исходного кода.

так как же вы можете получить то, что действительно хотите? (обратите внимание, что Maven имеет метод addCompileSourceRoot, но не соответствующий методу removeCompileSourceRoot.) Представьте себе следующее hack :

  1. переопределите значение по умолчанию <build><sourceDirectory> из src/main/java в ${project.build.directory}/generated-sources/delombok.
  2. переопределите стандартный деломбок sourceDirectory из src/main/lombok в src/main/java и отключите addOutputDirectory.

В основном, вы будете использовать src/main/java, но Maven будет игнорировать его и вместо этого использовать target/generated-sources/delombok. Плагин Lombok преобразует src/main/java в разработанный код в target/generated-sources/delombok.

<build>
  <sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>
  <plugins>
    <plugin>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok-maven-plugin</artifactId>
      <version>1.16.6.1</version>
      <executions>
        <execution>
          <id>delombok</id>
          <phase>generate-sources</phase>
          <goals>
            <goal>delombok</goal>
          </goals>
          <configuration>
            <addOutputDirectory>false</addOutputDirectory>
            <sourceDirectory>src/main/java</sourceDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
Обратите внимание, что вам не нужно взламывать другие плагины, такие как maven-jar-plugin или maven-javadoc-plugin, потому что они должны уважать sourceDirectory.

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

Похоже, что нет хорошего способа создать Ломбок Мэйвен. "Профильный" подход, предложенный @opyate, не работает из-за

Http://jira.codehaus.org/browse/MNG-5310

Однако действительно уродливый обходной путь состоит в том, чтобы просто иметь другой pom.xml, идентичный во всех отношениях, за исключением sourceDirectory переопределенного, используя аргументы командной строки для использования файла, как в:

Maven alternate pom