Класс, созданный Lombok @Builder в модуле Gradle, не найден в другом модуле - PullRequest
0 голосов
/ 05 июня 2019

Я хочу добавить Lombok к Gradle многомодульному проекту, но мне трудно его настроить. Читал документацию и несколько страниц, но я не могу заставить его работать, когда он связан с несколькими модулями.

Обновление: обновлено до версии Gradle 4.10.3, Java 8

В IntelliJ я мог бы заставить проект распознавать аннотацию @Builder в одном модуле и использовать сгенерированный класс построителя в отдельном модуле. Тем не менее, при запуске gradle build на терминале, я получаю:

/myprj/module1/src/main/java/CampaignTracker.java:143: error: cannot find symbol

CampaignBuilder campaignBuilder = Campaign.builder()
                                          ^
  symbol:   method builder()
  location: class CampaignLead

У нас есть Gradle многомодульный проект, который имеет следующую структуру:

myprj
  |- common
       |- Campaign.java
       |- build.gradle
  |- module1
       |- CampaignTracker.java
       |- build.gradle
  |- module2
       ...
  build.gradle

В общем модуле мы используем @Builder аннотацию lombok в Campaign.java классе, например:

@Builder
@AllArgsConstructor
public class Campaign {
   ...
}

Затем в отдельном модуле с именем module1 мы хотим использовать сгенерированный компоновщик с помощью lombok, например:

public class CampaignTracker implements Tracking {
    void buildCampaign() {
        CampaignBuilder campaignBuilder = Campaign.builder()
             .id(...)
             .name(...);
        //more stuffs
    }
}

В нашем корне build.gradle имеем:

subprojects {
    repositories {
        mavenLocal()
        mavenCentral()
    }

    apply plugin: 'java'
    apply plugin: 'maven'
    apply plugin: 'idea'
    apply plugin: "net.ltgt.apt"
    apply plugin: 'jacoco'

    tasks.withType(Test) {
        systemProperty 'user.country', 'US'
        systemProperty 'user.language', 'en'
    }

    dependencies {
        compileOnly 'org.projectlombok:lombok:1.18.8'
        annotationProcessor 'org.projectlombok:lombok:1.18.8'
    }
}

Моя проблема в том, что когда gradle компилирует второй модуль, который зависит от общего, он не находит предположительно сгенерированный класс Lombok Builder.

Обновление: если я собираю модуль самостоятельно с помощью gradle clean build -p commons -x test, я вижу, что генерируется CampaignBuilder, но когда я собираю весь проект, это не так.

Есть ли у вас идеи, почему Gradle не распознает / не находит сгенерированный Lombok код в отдельном модуле?

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Кажется, что сборка Gradle не настроена для применения Lombok- (IDE делает, потому что он достаточно умен). См. Документы в ломбок-градле ; Вы можете использовать плагин Gradle или добавить в модуль common:

dependencies {
  compileOnly 'org.projectlombok:lombok:1.18.8'
  annotationProcessor 'org.projectlombok:lombok:1.18.8'
}
0 голосов
/ 05 июня 2019

Я публикую этот ответ скорее как комментарий, чем как ответ, так как Daniele и M.Ricciuti помогли мне решить эту проблему.

Было несколько проблем:

В проекте использовался gradle wrapper 2.13, который не поддерживает процессор аннотаций. Я протестировал с помощью устаревшего плагина lombok, но не смог разобраться в проблеме. Жизнеспособным решением, которое я нашел, было обновление до последней версии 4.x (4.10.3).

Использование этой версии позволило мне избавиться от устаревшего плагина Gradle и просто добавить ответ Даниэля:

dependencies {
  compileOnly 'org.projectlombok:lombok:1.18.8'
  annotationProcessor 'org.projectlombok:lombok:1.18.8'
}

С другой стороны, IntelliJ был настроен на использование Gradle Wrapper (2.13), который не работает с annotationProcessor, поэтому был не , генерирующий операторы import.

Я отмечаю ответ Даниэля как правильный ответ, так как он также содержит комментарий М. Ричути

...