Как игнорировать исходный каталог 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!).
Ответы
Ответ 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