Maven Scope для Ломбока (компиляция против предоставленного)
Недавно я узнал, что 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 обычно используется для lombok?
Я использую Oracle JDK build 1.8.0_25-b17 на MacOSX 10.9
Ответы
Ответ 1
Ломбок должен использоваться в области provided
(см. официальные документы).
Причина (как было указано в комментариях) заключается в том, что lombok - это инструмент времени только для компиляции. То есть, это не требуется во время выполнения вообще. Сделав область provided
, вы создадите библиотеки lombok для компилятора, но это не зависимость вашей скомпилированной банки. Таким образом, ваша последняя банка не будет зависеть от Lombok, и ее не нужно включать в какое-либо развертывание, что уменьшает зависимости и размер ваших развертываемых компонентов.
Ответ 2
Обычно compile
. provided
предназначен для баннеров, которые обычно поставляются с сервером приложений, на котором будет размещено приложение. Если вы не хотите использовать банку в последнем приложении, возможно, лучше всего использовать плагин maven, а не банку: http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index.html
Ответ 3
Можно работать с compile
и true
для <optional/>
.
<scope>compile</scope>
<optional>true</optional>
См. Maven - дополнительные зависимости и исключения зависимостей.