Maven Scope для Lombok (компиляция или поставка)

Недавно я узнал, что 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 обычно используется для ломбока?

Я использую Oracle JDK build 1.8.0_25-b17 на MacOSX 10.9


person mkraemerx    schedule 01.04.2015    source источник
comment
Что ж, вам может потребоваться настроить прицел для тестирования. Что касается вашего вопроса, я обычно устанавливаю его на компиляцию, но это просто потому, что мне лень возиться с ним: p   -  person kucing_terbang    schedule 01.04.2015


Ответы (3)


Lombok следует использовать в provided области (см. официальную документацию).

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

person agentgonzo    schedule 19.07.2016
comment
В качестве побочного примечания, потому что это может сбить с толку многих людей: maven scope compile означает, что он доступен во время компиляции и во время выполнения. Если область видимости provided, она доступна только во время компиляции. См. stackoverflow.com/questions/6646959 - person Tim Büthe; 09.02.2017
comment
Меня тоже смутило это compile по сравнению с provided в java, когда я использовал lombok здесь. Спасибо за объяснение. - person eigenfield; 17.10.2019

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

person EmirCalabuch    schedule 01.04.2015
comment
+1 за плагин ломбок, не знал этого. Но все же для меня не очевидно, почему в этом случае не работает provided. Он должен быть доступен во время компиляции и больше не нужен на более поздних этапах. - person mkraemerx; 10.04.2015
comment
Чтобы быть уверенным, мне нужно хотя бы увидеть класс LongValidator, о котором сообщается об отсутствии, и, возможно, другие элементы в pom, но, скорее всего, проблема с provided заключается в том, что Lombok должен выполнять свою работу, когда происходит компиляция или во время выполнения. Если вы не включите его и не сгенерируете код Lombok при компиляции, ваш класс будет таким, как если бы он не обрабатывался Lombok. - person EmirCalabuch; 10.04.2015
comment
Для дальнейшего уточнения: Lombok - это не просто библиотека, это процессор, который изменяет код при компиляции. Поэтому вам нужно выполнить его при компиляции, если вы переключите его в область provided, этого не произойдет по умолчанию (вы можете заставить maven запустить процессор lombok, добавив -Dexec.classpathScope="compile" в командную строку.) - person EmirCalabuch; 10.04.2015
comment
Этот ответ неверен. Плагин не нужно использовать, и в документации указано, что объем - person OneCricketeer; 02.06.2021

Можно работать с compile и true для <optional/>.

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

См. Maven - Дополнительные зависимости и исключения зависимостей .

person Jin Kwon    schedule 23.03.2019
comment
projectlombok.org/setup/maven Официальная документация Lombok говорит об использовании provided области - person Cardin; 28.06.2021