Подтвердить что ты не робот

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

Я пытаюсь использовать Lombok Maven Plugin для обеспечения правильного создания Javadocs при использовании 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. Тем не менее, я не хочу этого делать, потому что он смущает IDE, и мой код компилируется просто отлично (если я удаляю плагин Maven).

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

4b9b3361

Ответ 1

Недавно я перешел от использования метода 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>

Ответ 2

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

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

В качестве альтернативы

  • Помощник сборки: там создать хелпер, который, кажется, предоставляет эту функцию, но я раньше этого не использовал.
  • Hack: там хак описан здесь, но автор рекомендует против него, и к тому же: если вы потратите время на изменение своего ПОМ и создание этот хак, вы также можете делать вещи "Правильный путь" и реализовывать профиль.

Ответ 3

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

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

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

  • Отмените значение по умолчанию <build><sourceDirectory> от src/main/java до ${project.build.directory}/generated-sources/delombok.
  • Отмените значение delombok 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 и некоторые другие разработчики.)

Ответ 4

Казалось бы, нет хорошего способа настроить Lombok Maven. Подход "профиля", предложенный @opyate, не работает из-за

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

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

Maven alternate pom