web-dev-qa-db-fra.com

Champ d'application Maven pour Lombok (compilation vs fourni)

J'ai récemment découvert que le lombok.jar se retrouve dans notre artefact final, ce qui ne devrait pas être nécessaire. À ma connaissance, lombok est uniquement à la compilation.

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

Mais quand je le mets à la portée fournie, j'obtiens un comportement étrange dans les tests unitaires. Ils se bloquent avec ClassNotFoundExceptions puis lors de la tentative de résolution

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

Quelle portée maven est généralement utilisée pour lombok?

J'utilise Oracle JDK build 1.8.0_25-b17 sur MacOSX 10.9

38
mkraemerx

Lombok doit être utilisé dans la portée provided (voir documents officiels ).

La raison (comme cela a été indiqué dans les commentaires) est que lombok est un outil de compilation uniquement. Autrement dit, il n'est pas nécessaire du tout à l'exécution . En rendant la portée provided, vous rendez les bibliothèques lombok disponibles pour le compilateur mais ce n'est pas une dépendance de votre jar compilé. En tant que tel, votre dernier pot ne dépendra pas de Lombok et il n'a pas besoin d'être inclus dans un déploiement, ce qui réduit les dépendances et la taille de vos déployables.

79
agentgonzo

Généralement compile. provided est destiné aux fichiers JAR qui sont généralement fournis avec le serveur d'applications qui hébergera l'application. Si vous ne voulez pas le pot dans l'application finale, il est peut-être préférable d'utiliser le plugin maven plutôt que le pot directement: http://awhitford.github.io/lombok.maven/lombok-maven- plugin/index.html

6
EmirCalabuch

On peut travailler avec compile et true pour <optional/>.

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

Voir Maven - Dépendances facultatives et exclusions de dépendances .

3
Jin Kwon