我今天浏览了互联网,试图让 Lombok 与 Maven 编译器插件一起工作,但没有找到不需要维护新源代码流的解决方案。
到目前为止,我已经尝试过:
使用常见问题解答中的建议,什么都没有。 我已将最新的 lombak jar 作为依赖项拉入:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
<scope>provided</scope>
</dependency>
不幸的是,根据 maven,这并不能解决编译问题。 我会注意到,FAQ 显示它仅适用于 Java 6,但许多其他发行说明显示 lombok 确实适用于 java 8。我需要至少 java 7 用于这个项目,并且可能需要 java 8 才能在任何其他项目中使用它。
接下来,我尝试在编译器插件上同时使用注释处理器:
<annotationProcessor>lombok.core.AnnotationProcessorr</annotationProcessor>
和
<annotationProcessor>lombok.launch.AnnotationProcessorxHider$AnnotationProcessor</annotationProcessor>
运行时两者都出现未找到。 这是我最好的构建,它仍然不起作用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<annotationProcessors>
<annotationProcessor>lombok.launch.AnnotationProcessorxHider$AnnotationProcessor</annotationProcessor>
</annotationProcessors>
</configuration>
</plugin>
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>2.2.4</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<!-- source output directory -->
<!--<outputDirectory>${generated-java-source}</outputDirectory>-->
<outputDirectory>/target/generated-sources</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<!--<source>${generated-java-source}</source>-->
<source>/target/generated-sources</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
唯一有效的方法是在常见问题解答中提出的。 使用 lombok maven 插件为整个项目生成源代码,然后将 maven 的源目录重新定位到生成的源目录。
我觉得这是一个糟糕的工作流程,因为每个其他插件都需要确保它们与该目录一起工作,并且不会与生成源的源目录发生冲突。
我在这里错过了什么大事吗。 我在 Windows 7 上使用 Intellij 15。我有 lombok intellij 插件,我可以通过命令行和 intellij 编译我的源代码,但不能通过命令行上的 maven 或 intellij 的 maven 插件。
我也遇到了这个。 Java 8,龙目岛 1.16.8。 在 Eclipse 中,一切正常,但是当我们进行 maven 构建时,它会失败。 在我们的特殊情况下,我们在调用 lombok 生成的方法时收到“错误:找不到符号”错误。
我认为这并不重要,但最终结果是构建的严重失败(本机方法中的致命错误:获取类状态的 JDWP,jvmtiError=JVMTI_ERROR_WRONG_PHASE(112))。
回退到 1.14.8 解决了这个问题(除了现在我们不能使用所有很棒的 1.16 好东西)。
这就是我在此期间为了让它工作而登陆的。 我确实必须将 Intellij 设置为从编译时排除目标目录,以便它在进行编译扫描时忽略 Delombok 的东西。
<build>
<sourceDirectory>target/generated-sources</sourceDirectory>
<!--<testSourceDirectory>target/generated-test-sources/delombok</testSourceDirectory>-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.16.8.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
</execution>
</executions>
<configuration>
<addOutputDirectory>false</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
<outputDirectory>target/generated-sources</outputDirectory>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
仅供参考 - 上述 pom 更改并不能解决我在 Eclipse 中的问题......我仍然收到“找不到符号”错误。
上面也触发了eclipse maven插件中的pom错误:
“目标 org.proj ectlombok:lombok-maven-plugin :1.16.8.0:delombok 的执行默认值失败:执行 org.proj ectlombok:lombok-maven-plugin :1.16.8.0:delombok:java.lang 时遇到 API 不兼容.IllegalAccessError: lombok/launch/Main"
不知道那里发生了什么,但似乎delombok也不适合我......
我对此进行了另一次尝试,现在我已经开始工作了。 在这里捕获它以防其他人在 Eclipse 中遇到此问题。
所以
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<versionRange>[1,)</versionRange>
<goals>
<goal>delombok</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
一旦我这样做了,一切都在 Eclipse 中正确构建,我可以使用 1.16.8 构建我的 Maven。 超级好用。 显然,Lombok 中仍然存在与使用独立 maven 构建相关的错误,但至少有一个非常合理的解决方法。
最有用的评论
我对此进行了另一次尝试,现在我已经开始工作了。 在这里捕获它以防其他人在 Eclipse 中遇到此问题。
所以delombok 的条目非常适合独立的 maven。 但它会导致 Maven 2 Eclipse 生命周期集成出现问题。 所以我看到的错误只是 M2E 说它不知道如何处理那个特定的生命周期步骤。 我需要做的就是添加明确的指令,让 m2e 忽略该步骤(毕竟,我们拥有它的唯一原因是让 maven 在 Eclipse 之外构建)。 这是大而可怕的,但不是超级复杂(这里是添加这种排除的文档:https://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.html):
一旦我这样做了,一切都在 Eclipse 中正确构建,我可以使用 1.16.8 构建我的 Maven。 超级好用。 显然,Lombok 中仍然存在与使用独立 maven 构建相关的错误,但至少有一个非常合理的解决方法。