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
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.
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
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 .