21

Maven 管理の Lombok プロジェクトがあり、Intellij を使用しています。ビルド後、.NET で生成されたソースが原因で、Intellij でクラスの重複に関する多くのエラーが常に発生しますtarget/generated-sources/delombok。これらのエラーを取り除くために私ができることはありますか? 今は目的のフォルダを削除するだけですが、これをしなければならないのは本当にイライラします。

Maven に標準構成があり、Lombok のソース コードは次のsrc/main/lombokとおりです。

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </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>
        </plugin>

  <profiles>
    <profile>
        <id>lombok-needs-tools-jar</id>
        <activation>
            <file>
                <exists>${java.home}/../lib/tools.jar</exists>
            </file>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok-maven-plugin</artifactId>
                    <version>1.16.8.0</version>
                    <dependencies>
                        <dependency>
                            <groupId>sun.jdk</groupId>
                            <artifactId>tools</artifactId>
                            <version>1.8</version>
                            <scope>system</scope>
                            <systemPath>${java.home}/../lib/tools.jar</systemPath>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
4

5 に答える 5

18

delombok の目標ドキュメントによると、デフォルトの出力ディレクトリは次のとおりです。

${project.build.directory}/generated-sources/delombok

次のような JetBrains チーム メンバーのコメントを見つけました。

IDEA は、その下に生成されたソースがない場合、ビルドの「ターゲット」フォルダーを自動的に除外します。

除外したい生成コードまたはビルド成果物がある場合は、それを「ターゲット」フォルダーの下に置くことができます。

これは、/generated-sourcesディレクトリがデフォルトで除外されていないことを意味します。一部のファイルを除外する場合は、それらを親/targetディレクトリの下ではなく、親ディレクトリの下に配置する必要があります/generated-sources

これを実現するには、プラグインを構成し、デフォルト以外を提供する必要があります<outputDirectory>

<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>1.16.18.0</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>delombok</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <sourceDirectory>src/main/java</sourceDirectory>
        <outputDirectory>${project.build.directory}/delombok</outputDirectory>
        <addOutputDirectory>false</addOutputDirectory>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

これにより、IDEA がDuplicate class found in (...)警告を生成しなくなります。

于 2017-07-28T21:19:30.740 に答える
1

Krzusiek のソリューションを試してみましたが、IntelliJ は src/main/java からのソース ファイルを重複としてマークします。

微調整に何度も失敗した後、lombok-maven-plugin最終的delombokにコンパイル後にフォルダーを削除することにしました。そのフォルダーのみのサーバーは、コンパイルの中間段階として (私の場合は、を介して AspectJ コンパイラーで lombok を使用するために必要でしたaspectj-maven-plugin)、ソースファイルがコンパイルされたら、それを保持する必要はありません。

delombokコンパイルのたびにフォルダーを手動で削除するのは非常に面倒なのでmaven-clean-plugin、フォルダーを具体的にターゲットとするの追加の実行を構成しました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>
于 2019-12-24T14:11:47.950 に答える