25

Lombok を使用するときに Javadoc が正しく作成されるように、 Lombok Maven Pluginを使用しようとしています。

Lombok Maven は、コンパイルの直前に、新しいコード生成の目標を導入します。私の構成では、 my sourceDirectory(Lombok アノテーション付き Java src/main/java) が処理されて、 で Java (Lombok アノテーションなし) が作成されますtarget/generated-sources/delombok

ただし、 のすべてのファイルにsourceDirectory対応する (同じ名前の) ファイルが に含まれるtarget/generated-sources/delombokようになったため、重複するクラスが原因でコンパイルが失敗します。

のソースを無視するように Java コンパイラに指示するにはどうすればよいsourceDirectoryですか?

デフォルトの Lombok Maven 構成では、開発者は Java (Lombok アノテーション付き) を のsrc/main/lombok代わりにフォルダーに配置することに注意してくださいsrc/main/java。ただし、IDE を混乱させ、コードが正常にコンパイルされるため (Maven プラグインを削除すると)、これを実行したくありません。

また、単に再定義するだけでも IDE を混乱させることに注意してくださいsourceDirectory(IDE は、Java ソース コードがどこにあるのかわかりません!)。

4

5 に答える 5

31

最近、flakey maven-exec-pluginアプローチを使用してjavadocツールのrawソースを生成する方法から、lombok-maven-pluginを使用する方法に切り替えました。

私のセットアップ

  • のすべてのソースsrc/main/java
  • 生成されたソースは入りますtarget/generated-sources/delombok

私は最初にこの問題に遭遇しましたが、それは簡単な修正のようです。lombok-maven-pluginに。を使用してコンパイラのソースパスにdelombokパスを追加させないでくださいaddOutputDirectoy。IE

<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>0.11.2.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>

これで今のところ問題は解決したようです

編集:ボーナス、この設定で適切なjavadocを生成する方法

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.8.1</version>
    <configuration>
        <defaultVersion>${project.version}</defaultVersion>
        <sourcepath>target/generated-sources/delombok</sourcepath>
    </configuration>
</plugin>
于 2012-08-13T08:53:38.187 に答える
3

新しいMaven プロファイルを作成し、新しいプロファイルでソースを再定義するだけです。

<sourceDirectory>target/generated-sources/delombok</sourceDirectory>

あるいは

  1. ビルド ヘルパー:この機能を提供すると思われるビルド ヘルパーがありますが、私はこれを使用したことがありません。
  2. ハック:ここにハックが説明されていますが、著者はそれを推奨していません。さらに、時間をかけて POM を変更してこのハックを作成する場合は、適切な方法でプロファイルを実装することもできます。
于 2012-07-04T14:07:50.473 に答える
2

目標は、delombokJava コードを から に変換するように設計されsrc/main/lombokていtarget/generated-source/delombokます。次に、 で見つかった他の Java コードsrc/main/javaが結合さtarget/generated-source/delombokれ、結合された Java クラスが生成されます。

delombok をソース コード ジェネレーターと考えると役に立ちます。

では、どうすれば本当に欲しいものを手に入れることができるでしょうか? (Maven にはaddCompileSourceRootメソッドがありますが、対応するremoveCompileSourceRootがないことに注意してください。) 次のハックを想像してください。

  1. <build><sourceDirectory>デフォルトのfromをオーバーライドしsrc/main/javaて be にします${project.build.directory}/generated-sources/delombok
  2. デフォルトの delombok を から be にオーバーライドし、sourceDirectory無効src/main/lombokにしsrc/main/javaますaddOutputDirectory

基本的には を使用しますがsrc/main/java、Maven はそれを無視して代わりに を使用しますtarget/generated-sources/delombok。Lombok プラグインはsrc/main/java、 で精巧なコードに変換されますtarget/generated-sources/delombok

<build>
  <sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>
  <plugins>
    <plugin>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok-maven-plugin</artifactId>
      <version>1.16.6.1</version>
      <executions>
        <execution>
          <id>delombok</id>
          <phase>generate-sources</phase>
          <goals>
            <goal>delombok</goal>
          </goals>
          <configuration>
            <addOutputDirectory>false</addOutputDirectory>
            <sourceDirectory>src/main/java</sourceDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

maven-jar-pluginやなどの他のプラグインをハックする必要はないことに注意してmaven-javadoc-pluginくださいsourceDirectory

このハックは自己責任で使用してください。 (私の推測では、これはあなたの IDE と他の開発者を混乱させるかもしれません。)

于 2015-09-01T07:19:30.650 に答える
2

他の回答のソリューションを使用しようとしましたが、IntelliJ はソース ファイルsrc/main/javaを重複としてマークします。delombokそのため、コンパイル後に のコンテンツを削除することにしました。最終的に、そのフォルダのみのサーバーはコンパイルの中間段階として (私の場合、AspectJ コンパイラで lombok を使用する必要がありました)、それを維持する必要はありません。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-24T12:52:38.883 に答える
0

LombokMavenをセットアップする良い方法はないようです。@opyateによって提案された「プロファイル」アプローチは、次の理由で機能しません

http://jira.codehaus.org/browse/MNG-5310

ただし、本当に醜い回避策は、コマンドライン引数を使用して次のようにファイルを使用することで、再定義pom.xmlされたものを除いてすべての点で同一の別のを単純に持つことです。sourceDirectory

Maven代替pom

于 2012-07-12T14:04:07.773 に答える