web-dev-qa-db-ja.com

Lombokを使用してMavenizedプロジェクトのIntellijで重複するクラスエラーを取り除く方法

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

私はMavenに標準構成を持っており、のlombokソースコードはmain/src/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>
15
Selena

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

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

JetBrainsチームのメンバーを見つけました コメント 次のように述べています:

IDEAは、その下に生成されたソースがない場合、ビルド 'target'フォルダーを自動的に除外します。それ以外の場合は、生成されたもの以外のすべてのサブフォルダーを除外します。

除外したい生成されたコードまたはビルドアーティファクトがある場合は、それを「target」フォルダーの下に置くことができます。

つまり、_/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 (...)警告を生成しなくなります。

8
Krzysiek

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

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

コンパイルのたびにdelombokフォルダーを手動で削除するのは非常に面倒なので、delombokフォルダーを具体的にターゲットとするmaven-clean-pluginの追加実行を構成しました。

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>
1
Bruno 82

アイデアは、生成されたソースをソースから削除することです。プロジェクト構造->パッケージのリストから選択し、右側でそのパッケージのソースを取得するために使用されているフォルダーを見つけます。そのリストに生成されたソースが見つかった場合は、それを削除します。