Как игнорировать исходный каталог 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
?
src/main/lombok
вместо src/main/java
. Однако я не хочу этого делать, потому что это путает IDEs и мой код компилируется просто отлично (если я удалю плагин Maven).
Также обратите внимание, что простое переопределение sourceDirectory
также расстроит IDEs (они больше не знают, куда идти найдите исходный код Java!).
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>
Альтернативно
- Build helper: естьbuild helper , который, кажется, обеспечивает эту функциональность, но я не использовал это раньше.
- Хак: есть Хак , описанный здесь , но автор рекомендует не делать этого, и кроме того: если вы собираетесь потратить время, чтобы изменить свой POM и создать этот хак, вы можете также делать вещи, которые вы хотите сделать. Правильный путь и реализовать профиль.
Цель
delombok
предназначена для преобразования кода java изsrc/main/lombok
вtarget/generated-source/delombok
. Затем другой код java, найденный вsrc/main/java
, объединяется сtarget/generated-source/delombok
для получения Объединенных классов java.Это помогает думать о деломбоке как о генераторе исходного кода.
так как же вы можете получить то, что действительно хотите? (обратите внимание, что Maven имеет метод addCompileSourceRoot, но не соответствующий методу removeCompileSourceRoot.) Представьте себе следующее hack :
- переопределите значение по умолчанию
<build><sourceDirectory>
изsrc/main/java
в${project.build.directory}/generated-sources/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 и некоторых других разработчиков.)
Похоже, что нет хорошего способа создать Ломбок Мэйвен. "Профильный" подход, предложенный @opyate, не работает из-за
Http://jira.codehaus.org/browse/MNG-5310
Однако действительно уродливый обходной путь состоит в том, чтобы просто иметь другой
pom.xml
, идентичный во всех отношениях, за исключениемsourceDirectory
переопределенного, используя аргументы командной строки для использования файла, как в: