[ОШИБКА]: невозможно найти символьную переменную log при сборке с maven и lombok - PullRequest
2 голосов
/ 28 апреля 2020

Я пытаюсь построить проект Java 11 с помощью регистратора maven и lombok @ Slf4j, но maven не распознает переменные log. Однако IntelliJ делает и может построить проект.

Ошибка

[ERROR]: cannot find symbol variable log 

Project и Module SDK оба Java 11. Версия Lombok 1.18.2:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

Настройка моего компилятора maven:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
                <forceJavacCompilerUse>true</forceJavacCompilerUse>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.12</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

Я уже пробовал:

  • выключение и включение обработки Annotaion
  • переустановка плагина Lombok
  • очистка .m2 / папки репозитория
  • ручное добавление lombok.jar в качестве процессора аннотаций
  • добавление пути Lombok в maven-compiler-plugin список процессоров аннотаций

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Это действительно минимальный пример конфигурации для использования аннотации @Slf4j lombok.

Вам нужен фасад регистрации и реализация, в этом случае я собираюсь использовать slf4j (в качестве фасада) и logback (в качестве реализации).


пом. xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>untitled</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
</project>   

основной. java

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Main {

    public static void main(String[] args) {
        log.debug("Hello");
    }
}

Если у вас возникли проблемы, всегда старайтесь принудительно запускать обновления зависимостей maven в папке вашего проекта mvn -U clean package и повторно импортировать проект maven в вашу IDE

See screenshot

1 голос
/ 28 апреля 2020

Я подозреваю, что это вводящее в заблуждение сообщение об ошибке вследствие того, что Lombok подключается во время компиляции.

В байт-коде нет понятия импорта. Классы заменяются их полностью определенными именами (например, от Integer до java.lang.Integer). Поэтому в какой-то момент компиляции импорт анализируется, применяется, и любые неизвестные классы (например, из-за отсутствия правильной зависимости) на этом этапе выдают ошибку.

Поскольку @Slf4j означает, что вы не необходимо импортировать org.slf4j.Logger, описанный выше шаг пропущен для этого класса.

После того, как Lombok добавил поле log, компилятор должен впоследствии посмотреть на его использование, см. класс org.slf4j.Logger, который он не распознает и выдает ошибку. При нормальных обстоятельствах, из-за более ранней стадии компиляции, единственная возможная причина состоит в том, что поле не существует, поэтому следует, что символ log должен отсутствовать. То, что он действительно не может понять, это тип поля log.

Поскольку Lombok вносит изменения в середине компиляции, я предполагаю, что ложные ошибки, такие как, всегда возможны , Возможно, разработчики Lombok могли бы исправить это, выполнив собственную проверку на org.slf4j.Logger. Большая часть функциональности, предоставляемой Lombok, не включает «импорт» внешних классов, поэтому я не удивлен, что он не обрабатывает этот крайний случай настолько элегантно, насколько это возможно.

Если вы добавите зависимость для SLF4J, компилятор больше не будет жаловаться.

...