2015-04-01 3 views
7

Недавно я узнал, что lombok.jar попадает в наш последний артефакт, который не должен быть необходимым. В моем понимании ломбок только время компиляции.Maven Scope для Lombok (Компиляция против предоставленного)

 <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 сфера в целом используемый для Ломбок?

Я использую Oracle JDK построить 1.8.0_25-B17 на MacOSX 10.9

+0

ну, вам может потребоваться установить область проверки. что касается вашего вопроса, я обычно устанавливаю его для компиляции, но это просто потому, что я ленив, чтобы беспокоиться об этом: p –

ответ

5

Обычно compile. provided предназначен для банок, которые обычно поставляются с сервером приложений, на котором будет размещено приложение. Если вы не хотите, чтобы банки в конечном приложении, это может быть, лучше использовать Maven плагин, а не банку непосредственно: http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index.html

+1

+1 для плагина lombok, не знал этого. Но все же, для меня не очевидно, почему в этом случае это не работает. Он должен быть доступен во время компиляции и больше не понадобиться на последующих этапах. – mkraemerx

+0

Чтобы быть уверенным, что мне нужно хотя бы увидеть класс LongValidator, который, как сообщается, отсутствует, и, возможно, другие элементы в pom, но, скорее всего, проблема с 'provided' заключается в том, что Lombok должен выполнять свою работу, когда компиляция имеет место, или во время выполнения. Если вы не включите его и не сгенерируете код Lombok при компиляции, ваш класс будет выглядеть так, как если бы Lombok не обрабатывался. – EmirCalabuch

+1

Чтобы уточнить: Lombok - это не просто библиотека, это процессор, который изменяет код при компиляции. Поэтому вам нужно выполнить его при компиляции, если вы переключите его на «предоставленную» область, это не произойдет по умолчанию (вы можете заставить maven запустить процессор lombok, добавив в командную строку '-Dexec.classpathScope =" compile "'.) – EmirCalabuch

23

Ломбок следует использовать в provided объеме (см official docs).

Причина (как указано в комментариях) заключается в том, что lombok - это инструмент, основанный на компиляции. То есть, он не нужен во время выполнения вообще. Сделав область provided, вы делаете библиотеки ломбок доступными для компилятора, но это не зависимость вашей скомпилированной банки. Таким образом, ваша последняя банка не будет зависеть от Lombok, и ее не нужно включать в какое-либо развертывание, что уменьшает зависимости и размер ваших развертываемых компонентов.

+2

В качестве побочного примечания, это может сбивать с толку для многих людей: maven scope 'compile' означает, что он доступен во время компиляции и во время выполнения. Если область «предоставляется», она доступна только во время компиляции. См. Http://stackoverflow.com/questions/6646959 –

Смежные вопросы