我正在尝试使用Lombok Maven Plugin来确保在使用Lombok时正确创建Javadoc。
Lombok Maven在编译之前引入了新的代码生成目标。在我的配置中,我的sourceDirectory
(带有Lombok注释的Java,src/main/java
)被处理为在target/generated-sources/delombok
中创建Java(没有Lombok注释)。
但是,sourceDirectory
中的每个文件现在都在target/generated-sources/delombok
中有一个相应的(名称相同的)文件,导致由于重复的类而导致编译失败。
如何告诉Java编译器忽略sourceDirectory
中的来源?
请注意,默认的Lombok Maven配置会让开发人员将Java(带有Lombok注释)放在src/main/lombok
文件夹而不是src/main/java
中。但是,我不希望这样做,因为它混淆了IDE,我的代码编译得很好(如果我删除了Maven插件)。
另请注意,简单地重新定义sourceDirectory
也会破坏IDE(他们不再知道在哪里可以找到Java源代码!)。
答案 0 :(得分:24)
我最近从使用flakey maven-exec-plugin方法转换为javadoc工具生成原始源以使用lombok-maven-plugin
我的设置
src/main/java
target/generated-sources/delombok
我最初遇到了这个问题,但它似乎是一个简单的修复:不要让lombok-maven-plugin使用addOutputDirectoy
将delombok路径添加到编译器源路径。 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>
这似乎解决了现在的问题
编辑:Bonus,如何使用此设置生成正确的javadoc
<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>
答案 1 :(得分:3)
创建一个新的Maven profile,在新的个人资料中,只需重新定义来源:
<sourceDirectory>target/generated-sources/delombok</sourceDirectory>
<强>替代地强>
答案 2 :(得分:2)
delombok
目标旨在将java代码从src/main/lombok
转换为target/generated-source/delombok
。然后,src/main/java
中的其他java代码与target/generated-source/delombok
结合生成组合的java类。
将delombok视为源代码生成器会有所帮助。
那么你怎么能得到你真正想要的东西?(注意Maven有一个addCompileSourceRoot方法,但没有相应的 removeCompileSourceRoot 。)想象一下的劈强>:
<build><sourceDirectory>
的默认src/main/java
覆盖为${project.build.directory}/generated-sources/delombok
。sourceDirectory
的默认delombok 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
。
使用此hack需要您自担风险。(我的猜测是这可能会让您的IDE和其他一些开发人员感到困惑。)
答案 3 :(得分:0)
似乎没有很好的方法来设置Lombok Maven。 @opyate建议的“配置文件”方法因
而无效http://jira.codehaus.org/browse/MNG-5310
然而,一个非常丑陋的解决方法是简单地使用另一个pom.xml
,除了重新定义sourceDirectory
之外,在各方面都相同,使用命令行参数来使用文件,如:
答案 4 :(得分:0)
我尝试使用其他答案中的解决方案,但是IntelliJ仍会将来自src/main/java
的源文件标记为重复。因此,我决定在编译后摆脱delombok
的内容。最后,该文件夹仅是服务器作为编译的中间阶段(在我的情况下,要求将Lombok与AspectJ编译器一起使用),并且没有必要保留它。我通过配置clean插件的其他执行来做到这一点,该插件专门针对delombok
文件夹。
您的POM应该包含
<build>
<sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>
<plugins>
<!-- will delombok source files into /target/generated-sources/delombok -->
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.16.16.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>
<!-- other plugins bound to compile phase should go here -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<executions>
<execution>
<id>delombok-removal</id>
<phase>compile</phase>
<goals>
<goal>clean</goal>
</goals>
<configuration>
<excludeDefaultDirectories>true</excludeDefaultDirectories>
<filesets>
<fileset>
<directory>${project.build.sourceDirectory}/com</directory> <!-- assuming your root package is something like com.mycompany -->
</fileset>
</filesets>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>