lombok 是否应该在 spring-boot-dependencies 中提供一个作用域?

Sha*_*ark 6 spring-boot

根据 Project Lombok 文档,lombok 依赖项应该是提供的范围 ( https://projectlombok.org/setup/maven )。该范围是否应该<dependencyManagement>在 spring-boot-dependencies pom.xml 中定义?

Jor*_*ana 9

spring-boot-dependencies pom.xml 只是对协同工作的库版本的描述。它们在dependencyManagement 中定义。

如果您有一个 Spring Boot 应用程序并且想要使用 lombok,则必须在项目 pom 的“依赖项”部分中明确说明这一点,但您可以排除该版本,因为它已在 spring-boot-dependencies 中定义。并且您还可以声明依赖项是“提供的”或更好的“可选的”。

<scope>provided</scope> 意味着编译和测试类路径需要该库,但是它是由某种容器提供的

<optional>true</optional> 意味着编译需要一个库,但在运行时不需要


编辑:似乎 Spring Boot Maven 插件总是打包您的依赖项,即使您将它们声明为可选或提供的,至少当您将应用程序打包为 jar 时,我没有使用 war 进行测试。

原因是一个 jar 包含一个嵌入式 servlet 容器并且 Spring Boot 打包需要为这个容器提供所提供的库,是有道理的!(谢谢@Peter Wippermann)。

我想结论是,在使用 Spring Boot maven 插件打包 jar 时,是否为 lombok 提供范围并不重要,因为库将始终被打包,除非出于语义原因要使用范围...

对于未包含在包中的 lombok,您只需要使用排除配置来配置 Spring Boot maven 插件。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

  • 您不能省略“provided”范围!即使标记为可选,lombok.jar 也会包含在您的应用程序部署包中。除了您的解释之外,“可选”用于**可能在运行时**使用的依赖项(一种非常罕见的情况)。Lombok 在运行时绝对不需要,因此将其声明为可选是不正确的。 (2认同)