Lombok: Maven编译问题

创建于 2016-03-16  ·  4评论  ·  资料来源: projectlombok/lombok

我今天浏览了互联网,试图让 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 插件。

最有用的评论

我对此进行了另一次尝试,现在我已经开始工作了。 在这里捕获它以防其他人在 Eclipse 中遇到此问题。

所以delombok 的条目非常适合独立的 maven。 但它会导致 Maven 2 Eclipse 生命周期集成出现问题。 所以我看到的错误只是 M2E 说它不知道如何处理那个特定的生命周期步骤。 我需要做的就是添加明确的指令,让 m2e 忽略该步骤(毕竟,我们拥有它的唯一原因是让 maven 在 Eclipse 之外构建)。 这是大而可怕的,但不是超级复杂(这里是添加这种排除的文档:https://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.html):

    <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 构建相关的错误,但至少有一个非常合理的解决方法。

所有4条评论

我也遇到了这个。 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 中遇到此问题。

所以delombok 的条目非常适合独立的 maven。 但它会导致 Maven 2 Eclipse 生命周期集成出现问题。 所以我看到的错误只是 M2E 说它不知道如何处理那个特定的生命周期步骤。 我需要做的就是添加明确的指令,让 m2e 忽略该步骤(毕竟,我们拥有它的唯一原因是让 maven 在 Eclipse 之外构建)。 这是大而可怕的,但不是超级复杂(这里是添加这种排除的文档:https://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.html):

    <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 构建相关的错误,但至少有一个非常合理的解决方法。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

gardenias picture gardenias  ·  3评论

zenglian picture zenglian  ·  3评论

mmoayyed picture mmoayyed  ·  3评论

lombokissues picture lombokissues  ·  3评论

michaelkuechler picture michaelkuechler  ·  3评论