web-dev-qa-db-ja.com

LombokのMavenスコープ(コンパイルと提供)

最近、lombok.jarが最終的なアーティファクトになりますが、これは必要ではないことがわかりました。私の理解では、ロンボクはコンパイル時のみです。

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.14.4</version>
        </dependency>

しかし、提供されたスコープに設定すると、ユニットテストで奇妙な動作が発生します。解決しようとすると、ClassNotFoundExceptionsでクラッシュします

Java.lang.NoClassDefFoundError: com/svv/esp/serviceimpl/dataimport/common/validation/LongValidator

一般的にロンボクに使用されるMavenスコープはどれですか?

MacOSX 10.9でOracle JDKビルド1.8.0_25-b17を使用しています

38
mkraemerx

Lombokはprovidedスコープで使用する必要があります( official docs を参照)。

理由(コメントで述べられているように)は、lombokがコンパイル時のみのツールであることです。つまり、実行時ではまったく必要ありません。スコープをprovidedにすることで、コンパイラでロンボックライブラリを使用できるようになりますが、コンパイルされたjarの依存関係はnotです。そのため、最終的なjarはLombokに依存せず、デプロイメントに含める必要がないため、デプロイ可能ファイルの依存関係とサイズが削減されます。

79
agentgonzo

通常、compileprovidedは、アプリケーションをホストするアプリケーションサーバーに通常同梱されているjar用です。最終的なアプリケーションでjarが必要ない場合は、jarではなくmavenプラグインを直接使用することをお勧めします。 http://awhitford.github.io/lombok.maven/lombok-maven- plugin/index.html

6
EmirCalabuch

<optional/>にはcompiletrueを使用できます。

<scope>compile</scope>
<optional>true</optional>

Maven –オプションの依存関係と依存関係の除外 を参照してください。

3
Jin Kwon