java Lombok的Maven Scope(编译与提供)

pkmbmrz7  于 2023-05-15  发布在  Java
关注(0)|答案(4)|浏览(231)

我最近发现lombok.jar最终出现在我们的最终工件中,这应该是不必要的。据我所知,lombok只是编译时。

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

但是当我将其设置为提供的范围时,我在单元测试中得到了奇怪的行为。它们在尝试解析时会因ClassNotFoundException而崩溃

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

Lombok岛通常使用哪个maven范围?
我在MacOSX 10.9上使用Oracle JDK build 1.8.0_25-b17

bfnvny8b

bfnvny8b1#

Lombok应在provided范围内使用(参见official docs)。
原因(如注解中所述)是lombok是一个仅编译时工具。也就是说,在运行时根本不需要它。通过将作用域设置为provided,您可以使编译器可以使用lombok库,但它不是编译后的jar的依赖项。因此,您的最终jar将不依赖于Lombok,并且不需要包含在任何部署中,这减少了可部署文件的依赖性和大小。

avkwfej4

avkwfej42#

可以使用compiletrue来处理<optional/>

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

参见Maven – Optional Dependencies and Dependency Exclusions

ryevplcw

ryevplcw3#

您必须配置spring-boot-maven-plugin以从Spring可执行jar文件中排除lombok jar。
下面是一个来自pom.xml的插件配置示例:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <addResources>true</addResources>
        <classifier>module</classifier>
        <excludes>
            <exclude>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
    </configuration>
</plugin>
hpcdzsge

hpcdzsge4#

通常是compileprovided用于jar,这些jar通常与将承载应用程序的应用程序服务器一起提供。如果你不想在最终的应用程序中使用jar,那么最好使用maven插件而不是直接使用jar:http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index.html

相关问题