Lombok: Mavenコンパイルの問題

作成日 2016年03月16日  ·  4コメント  ·  ソース: projectlombok/lombok

私は今日、LombokをMavenコンパイラプラグインで動作させることを試みてインターネットを駆け巡りましたが、新しいソースコードフローを維持する必要のないソリューションを見つけられませんでした。

これまでに試しました:

FAQで提案されていることを使用して、何もしません。 依存関係として最新のlombakjarをプルしました:

       <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.8</version>
            <scope>provided</scope>
        </dependency>

残念ながら、これはMavenによるとコンパイルの問題を修正するために何もしません。 FAQはJava6でのみ機能することを示していますが、他の多くのリリースノートでは、lombokがJava8で機能することを示しています。このプロジェクトには少なくともjava7が必要であり、他のプロジェクトで使用するにはおそらくjava8が必要です。

次に、コンパイラプラグインの注釈プロセッサを次の両方で使用しようとしました。

    <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のソースディレクトリをその生成されたソースディレクトリに再配置します。

他のすべてのプラグインは、それらがそのディレクトリで動作し、ソースが生成されているソースディレクトリと競合しないことを保証する必要があるため、これは悪いワークフローだと思います。

ここで何か大きなものが欠けていますか? Windows7でIntellij15を使用しています。lombokintellijプラグインがあり、コマンドラインとintellijを介してソースをコンパイルできますが、コマンドラインのmavenまたはintellijのmavenプラグインを介してコンパイルすることはできません。

最も参考になるコメント

私はこれをもう一度突き刺しました、そして私は今それを動かしています。 Eclipseで他の誰かがこれに遭遇した場合に備えて、ここでキャプチャします。

だからdelombokのエントリは、スタンドアロンのMavenに最適です。 ただし、Maven 2Eclipseライフサイクル統合に問題が発生します。 したがって、私が見たエラーは、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ビルドを実行できます。 超便利です。 明らかに、スタンドアロンのMavenを使用したビルドに関連するLombokにはまだバグがありますが、少なくとも非常に合理的な回避策があります。

全てのコメント4件

私もこれに遭遇しています。 Java 8、Lombok1.16.8。 Eclipseの内部では、すべてが正しく機能しますが、Mavenビルドを実行すると失敗します。 私たちの特定のケースでは、呼び出しているlombokで生成されたメソッドで「エラー:シンボルが見つかりません」というエラーが発生します。

それは重要ではないと思いますが、最終的にはビルドのハードエラーになります(ネイティブメソッドの致命的なエラー:クラスステータスの取得時のJDWP、jvmtiError = JVMTI_ERROR_WRONG_PHASE(112))。

1.14.8に戻すと、問題は解決します(ただし、今を除いて、すべてのすばらしい1.16グッズを使用することはできません)。

これは私がそれを機能させるためにその間に着陸したものです。 コンパイルスキャンを実行するときにDelombokのものを無視するように、コンパイル時にターゲットディレクトリを除外するようにIntellijを設定する必要がありました。

    <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での問題を修正しません...それでも「シンボルが見つかりません」というエラーが発生します。

上記は、EclipseMavenプラグインでpomエラーもトリガーします。

"目標org.projectlombok: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 2Eclipseライフサイクル統合に問題が発生します。 したがって、私が見たエラーは、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ビルドを実行できます。 超便利です。 明らかに、スタンドアロンのMavenを使用したビルドに関連するLombokにはまだバグがありますが、少なくとも非常に合理的な回避策があります。

このページは役に立ちましたか?
0 / 5 - 0 評価