【问题标题】:Gradle build fails due to lombok由于 lombok,Gradle 构建失败
【发布时间】:2020-12-22 23:41:17
【问题描述】:

我正在使用 Gradle 4.10.2(但可以使用最新版本来让它工作)。这是我的 gradle 文件:

plugins {
    id 'org.springframework.boot' version '2.2.5.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    jcenter()
}

ext {
    set('springCloudVersion', "Hoxton.SR3")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    runtime 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

当我执行bootJar 时,它失败并出现很多错误。这些错误都是由于没有找到由 lombok 自动生成的 getter、setter 等。我该如何解决这些错误?我看过其他关于这个问题的帖子,他们都建议将 lombok 依赖项添加为 annotationProcessor 和 compileOnly 但我已经这样做了,但仍然存在这个问题。

更新

这是我得到的几个错误:

C:\Users\user\eclipse-workspace\example\src\main\java\com\example\proj\service\CarService.java:60: error: cannot find symbol
            log.debug("calling for cars {} ", cars);
            ^
  symbol:   variable log
  location: class CarService
C:\Users\user\eclipse-workspace\example\src\main\java\com\example\proj\service\CarService.java:66: error: cannot find symbol
                CarDtoBuilder dtoBuilder = dtoBuilderByCar.getOrDefault(
                ^
  symbol:   class CarDtoBuilder
  location: class CarService

日志应该来自注解@Slf4j。 CarDtoBuilder 来自于 CarDto 上注释的 @Builder(builderMethodName = "hiddenBuild")。两者都是 lombok 注释。

更新 2

现在正在尝试 Gradle 4.10.3。结果相同。这是gradle -v 的输出:

------------------------------------------------------------
Gradle 4.10.3
------------------------------------------------------------

Build time:   2018-12-05 00:50:54 UTC
Revision:     e76905e3a1034e6f724566aeb985621347ff43bc

Kotlin DSL:   1.0-rc-6
Kotlin:       1.2.61
Groovy:       2.4.15
Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM:          1.8.0_222 ( 25.222-b10)
OS:           Windows 10 10.0 amd64

更新 3

我已经使用 Gradle 6 进行了尝试,结果相同。我试过使用 Windows 和 Mac ......结果相同。我尝试过使用 JDK 11 而不是 JDK 8...同样的结果。

更新 4

我正在使用@Builder lombok 注释。我想知道这是否会导致问题。

【问题讨论】:

  • 如果您使用基于 Eclipse/Eclipse 的 IDE,请尝试此操作 - journaldev.com/18124/java-project-lombok
  • 我正在使用 Eclipse 和 BuildShip。使用 IDE 和 Boot Dashboard 可以正常编译。仅在使用 BuildShip 发出 bootJar 时才会失败
  • 我刚刚在命令行中尝试使用gradle bootJar 和同样的问题。
  • 使用的是哪个版本的龙目岛?使用最新版本 1.18 它应该可以工作。否则还有更多推荐here。
  • @flaxel - Lombok v1.18.12。感谢您的链接。现在看看。

标签: spring-boot gradle lombok


【解决方案1】:

我在您的 build.gradle 文件中没有看到您的 lombok-plugin 配置。

我必须在我的项目中为 gradle 4.10.3 设置 lombok,这就是我所做的:

group 'io.metadata'
version '1.11-SNAPSHOT'

apply plugin: 'java'

project.ext.set("spring.boot.version", "2.2.6.RELEASE")
project.ext.set("spring.core.version", "5.2.5.RELEASE")

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath("io.freefair.gradle:lombok-plugin:5.0.0-rc4")
    }
}

subprojects {
    repositories {
        mavenLocal()
        mavenCentral()
    }

    apply plugin: 'java'
    apply plugin: 'io.freefair.lombok'
}

检查apply plugin: 'io.freefair.lombok' 以及在buildscript 上为其定义的依赖项。

请注意,我使用的是多模块项目,但无论哪种方式,您都可以使用 lombok 插件和apply。

使用 lombok-plugin 不是强制性的,但它工作得很好而且很容易做到。您可以在此处遵循文档: https://plugins.gradle.org/plugin/io.freefair.lombok

【讨论】:

  • 尝试使用该插件时出现错误:An exception occurred applying plugin request [id: 'io.freefair.lombok', version: '5.1.1'] Failed to apply plugin [class 'io.freefair.gradle.plugins.lombok.LombokBasePlugin'] Could not generate a proxy class for class io.freefair.gradle.plugins.lombok.LombokExtension. org/gradle/api/provider/MapProperty
  • @user8297969 尝试使用较低版本(我在答案中发布的那个),您使用的是最新的插件版本,但您的 gradle 是 4.10.3
  • 我会尝试,但我不确定为什么我的其他项目在没有插件的情况下也能工作。我也不介意使用 Gradle 6 或其他更新的版本。您的帖子说它使用的是 4.10.3。你想让我试试哪个 gradle 版本?
  • @user8297969 好吧......使用最新版本总是很好。请记住,如果您使用 gradle 4.10.3,您将需要与该版本兼容的 lombok 插件。在我的回答中,我发布了带有兼容插件 5.0.0-rc4 的 gradle 4.10.3。你可以使用我的这个配置,因为我知道它可以工作(我正在使用它),一旦你让它工作,你可以将 gradle/plugin 升级到最新版本。
  • 我尝试使用最新的 Gradle 版本,它允许 plugins { id "iofreefair.lombok" version "5.1.1"}。但我得到相同的编译错误。我正在使用plugins,所以不确定如何使用apply plugin。这给了我一个错误。
【解决方案2】:

删除对涉及 lombok 生成的代码的静态导入的任何引用。就我而言,我有:

import static com.example.car.dto.CarDto.CarDtoBuilder;

CarDtoBuilder 是通过 CarDto 类上的 lombok @Builder 生成的。一旦解决,其他 lobmok compile 相关的问题如log symbol not found (created by @Slf4j) 就消失了。

【讨论】:

  • 谢谢,这解决了我的编译问题
猜你喜欢
  • 2018-01-12
  • 2013-02-23
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-01-16
  • 2017-03-16
  • 2014-04-13
  • 2021-05-26
相关资源
最近更新 更多