การสร้างด้วย @ Slf4j และ Intellij ของ Lombok: ไม่พบบันทึกสัญลักษณ์


114

ฉันมีโครงการ maven ที่สร้างขึ้นโดยไม่มีปัญหาจากบรรทัดคำสั่ง อย่างไรก็ตามเมื่อฉันสร้างด้วย IntelliJ ฉันได้รับข้อผิดพลาด:

java: FileName.java:89: cannot find symbol
symbol  : variable log

ไม่มีบันทึกที่กำหนดหรือนำเข้าในไฟล์ java แต่มีไฟล์

@Slf4j
final public class FileName {

คำสั่งก่อนเนื้อหาคลาสซึ่งควรกำหนดคลาสล็อก

ในหน้าต่างโครงสร้างโปรเจ็กต์คลาสสำหรับ:

Maven: org.slf4j:jcl-over-slf4j:1.6.1
Maven: org.slf4j:slf4j-api:1.6.6
Maven: org.slf4j:slf4j-log4j12:1.6.6
Maven: org.slf4j:slf4j-simple:1.6.6

แสดงอยู่ภายใต้ไลบรารีและระบุว่าดาวน์โหลดแล้วและพร้อมใช้งาน

มีความคิดว่าทำไมสิ่งนี้ถึงสร้างด้วย maven ผ่านทางบรรทัดคำสั่ง แต่ไม่ใช่ผ่าน IntelliJ และจะแก้ไขปัญหาได้อย่างไร


5
มีปัญหาเดียวกันการติดตั้ง Lombok Plugin ใหม่ช่วยได้
Alex Shumilov

คำตอบ:


175

นอกเหนือจากการติดตั้งปลั๊กอิน Lombokแล้วตรวจสอบให้แน่ใจว่าได้Enable annotation processingเลือกช่องทำเครื่องหมาย "" ไว้ใต้:

Preferences > Compiler > Annotation Processors

หมายเหตุ:ตั้งแต่ IntelliJ 2017 Enable Annotation Processingช่องทำเครื่องหมาย "" ได้ย้ายไปที่:

Settings > Build, Execution, Deployment > Compiler > Annotation Processors

1
ฉันไม่ได้เปิดใช้งานการประมวลผลคำอธิบายประกอบและใช้งานได้: | ฉันมีปลั๊กอินลอมบอกติดตั้งอยู่
Ben George

ฉันติดตั้งปลั๊กอินและใช้งานได้โดยไม่ต้องเปลี่ยนการตั้งค่านี้ อย่างไรก็ตามฉันตัดสินใจที่จะเปลี่ยนแปลงเพื่อการวัดที่ดี
sheldonkreger

6
การใช้ปลั๊กอิน IntelliJ 2017.2 และ Lombok 0.14.16 จำเป็นต้องมีการตั้งค่า "เปิดใช้งานการประมวลผลคำอธิบายประกอบ" และช่องทำเครื่องหมายจะอยู่ภายใต้การตั้งค่า -> การสร้างการดำเนินการการปรับใช้ -> คอมไพเลอร์ -> โปรเซสเซอร์คำอธิบายประกอบ
Niemi

1
IntelliJ 2018.2, ปลั๊กอิน lombok ติดตั้ง 1.14 ฉันยังต้องเปิดใช้งานการประมวลผลคำอธิบายประกอบใน IntelliJ File-> Settings-> Build, Execution, Deployment-> Compiler-> Annotation Processors IntelliJ ไม่ชนะคะแนนกับฉันจริงๆ
demaniak

32

สันนิษฐานว่านั่นคือคำอธิบายประกอบLombok @ Slf4j ที่คุณใช้อยู่ คุณจะต้องติดตั้งปลั๊กอิน Lombok ใน IntelliJ หากคุณต้องการให้ IntelliJ จดจำคำอธิบายประกอบของ Lombok มิฉะนั้นคุณจะคาดหวังอะไรหากคุณพยายามใช้ฟิลด์ที่ไม่มีอยู่


1
ฉันติดตั้งปลั๊กอิน Lombok แล้ว ดูเหมือนจะไม่มีอะไรมากในแง่ของตัวเลือกการกำหนดค่า บางทีอาจเป็นข้อผิดพลาดในปลั๊กอิน?
user1991839

1
ฉันใช้มันสำเร็จกับ IDEA 11 และ 12 ในบางครั้งดูเหมือนว่าจะ "ลืม" เกี่ยวกับลอมบอกไปบ้างและฉันได้รับเส้นสีแดงจำนวนมากในซอร์สโค้ด แต่ก็ยังคงสร้างให้ฉัน แม้ว่ามันจะมาและไปดังนั้นปลั๊กอินจึงไม่มีข้อผิดพลาดอย่างแน่นอน
Ryan Stewart

คุณรู้หรือไม่ว่ามีวิธีแก้ปัญหาเพื่อให้ผ่านพ้นปัญหานี้หรือไม่? เช่นเดียวกับการแจ้ง IntelliJ ของห้องสมุด Lombok โดยไม่ต้องผ่านปลั๊กอิน? ฉันพยายามใช้ IntelliJ สำหรับการทดสอบการดีบักและทำให้ยากสำหรับฉันที่จะใช้มันสำหรับสิ่งนั้น
user1991839

ขออภัยไม่สามารถช่วยคุณได้ ฉันยังไม่เคยใช้ลอมบอกมากนัก ฉันเพิ่งทดลองใช้ในไม่กี่แห่ง ฉันจะดูหน้าโครงการของปลั๊กอินแต่ฉันรู้สึกว่ายังไม่มีชุมชนใหญ่มาก
Ryan Stewart

24

ใน Intellij เวอร์ชัน 2016, 2017 เปิดใช้งาน Preferences -> Compiler -> Annotation Processors ไม่ได้ผลสำหรับฉัน!

ช่องทำเครื่องหมายเพิ่มเติมต่อไปนี้ช่วย: ป้อนคำอธิบายภาพที่นี่


1
ฉันเพิ่มปลั๊กอินและเปิดใช้งาน Annotation Processors แต่ยังไม่มีโชค คุณสามารถระบุวิธีการเข้าถึงช่องทำเครื่องหมายด้านบนได้หรือไม่?
Philip John

@PhilipJohn: ในช่องค้นหา Preferences พิมพ์ "Lombok"?
Tim Long

จริงๆแล้วเราต้องเพิ่มการพึ่งพา "org.slf4j" ด้วย
Vasyl Sarzhynskyi


10

ฉันอาจจะ ungraving หัวข้อตาย แต่เป็นทางออกที่ง่ายคือการตรวจสอบในการอ้างอิงของคุณ (pom Maven สำหรับกันตัวอย่าง) ถ้าคุณกำลังรวมทั้งlogback-coreและlogback คลาสสิก

Slf4jเป็นเพียงอินเทอร์เฟซคุณต้องมีการใช้งานที่เป็นรูปธรรมเบื้องหลังจึงจะทำงานได้

ผมเคยถูกหลอกเป็นครั้งที่สองที่มีความคิด messing มันขึ้นตอนนี้ผมดีไป: D


8

ทำงานให้ฉัน !!! มันล้มเหลวใน CircleCI & บน Jenkins เช่นกัน

หากคุณเป็นผู้ใช้ Gradle ให้ลองเพิ่มสิ่งต่อไปนี้ในการอ้างอิงของคุณ:

dependencies {
    //Other Dependencies >>

    //LOMBOK Dependencies
    annotationProcessor 'org.projectlombok:lombok'
    compileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
}

3 รายการสุดท้ายคือสิ่งที่ฉันต้องเพิ่มเมื่อใช้ Gradle สำหรับโครงการก่อนหน้านี้ฉันได้ดูแลปลั๊กอิน Lombok แล้วและช่องทำเครื่องหมายตัวประมวลผลคำอธิบายประกอบสำหรับโครงการก่อนหน้านี้ที่เราใช้ Maven ฉันพบข้อผิดพลาดนี้หลังจากใช้ IntelliJ เพื่อสร้างโปรเจ็กต์ Spring Boot โดยเลือก Lombok มันรวมบรรทัด compileOnly และ annotationProcessor แต่ไม่ใช่บรรทัด test *
Xenson

4

ใน IDEA 13 ดูเหมือนว่าจะไม่มีปัญหาอีกต่อไปคุณเพียงแค่ต้องติดตั้งปลั๊กอิน Lombok


4

ฉันเพิ่งติดตั้งเวอร์ชันความคิดล่าสุด 2108.1 และพบปัญหานี้หลังจากติดตั้งปลั๊กอินลอมบอกและรีสตาร์ท Idea แก้ไขปัญหา


4

หากคุณใช้ maven ลองเพิ่มเส้นทาง Lombok ในmaven-compiler-pluginรายการตัวประมวลผลคำอธิบายประกอบดังที่แสดงด้านล่าง

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.3.0.Final</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.10</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>

เปลี่ยนเวอร์ชันตามเวอร์ชันลอมบอกของคุณ นอกเหนือจากนั้นให้แน่ใจว่าคุณได้ทำสิ่งต่อไปนี้แล้ว

  • ติดตั้งปลั๊กอิน Lombok สำหรับ Intellij
  • File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processorเปิดใช้งานการประมวลผลคำอธิบายประกอบสำหรับโครงการของคุณภายใต้ สำหรับฉันทั้งสองอย่างObtain processors from project classpathและProcessor pathกำลังทำงานอยู่ ดังนั้นไม่แน่ใจว่าอะไรจะเหมาะกับคุณ แต่ลองดูว่าแบบใดใช้ได้ผล

และแทนที่จะถ่ายภาพในที่มืดเป็นเวลาหลายชั่วโมง การอ่านข้อมูลเล็กน้อยว่าตัวประมวลผลคำอธิบายประกอบทำงานอย่างไรและใช้โดยคอมไพเลอร์อาจช่วยได้ ดังนั้นโปรดอ่านอย่างรวดเร็วด้านล่าง

http://hannesdorfmann.com/annotation-processing/annotationprocessing101


3

ฉันลองใช้คำตอบที่กล่าวมาเกือบทั้งหมดแล้ว แต่ไม่มีอะไรได้ผลสำหรับฉัน การสร้างการไล่ระดับของฉันล้มเหลวทุกครั้ง เพิ่งพบโซลูชันนี้:

เพิ่มannotationProcessor 'org.projectlombok:lombok' ใน build.gradle ของคุณ

สิ่งนี้ได้ผลสำหรับฉัน


3

การลบคำอธิบายประกอบ @ Slf4J ออกจากคลาสแล้วเพิ่มอีกครั้งใช้ได้ผลสำหรับฉัน


2

สิ่งนี้ใช้ได้ผลสำหรับฉัน: File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processor

ทำเครื่องหมายที่ "เปิดใช้งานการประมวลผลคำอธิบายประกอบ" Apply

ปิด


2

1 ผู้อุปการะลอมบอกของฉัน:

implementation 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'

2 หลังจากเปิดใช้งาน "คำอธิบายประกอบ ... " ใน IDEA (การตั้งค่า) โดยพิจารณาว่าคุณได้ติดตั้งปลั๊กอิน Lombok แล้วซึ่งช่วยแก้ปัญหาเดียวกันของฉันได้


1

ฉันพบปัญหานี้กับ Lombok เวอร์ชันเก่ากว่าเมื่อรวบรวมภายใต้ JDK8 การตั้งค่าโปรเจ็กต์กลับไปที่ JDK7 ทำให้ปัญหานี้หายไป


การอัพเกรดการพึ่งพาลอมบอกใน pom ก็ใช้ได้เช่นกัน :)
Christophe Moine

1

นี่จะไม่ใช่ปัญหาของ OP แต่สำหรับใครก็ตามที่พยายามทุกอย่างแล้วไม่ประสบความสำเร็จ:

ฉันมีอาการคล้าย ๆ กัน เมื่อใดก็ตามที่ฉันสร้างหลังจากmvn cleanนั้นมันจะไม่พบlogหรือgetXYZ()หรือbuilder()หรืออะไรเลย

[ERROR]   symbol:   variable log
[ERROR]   location: class com.example.MyClass
[ERROR] /Path/To/Some/Java/src/main/com/example/MyClass.java:[30,38] cannot find symbol
[ERROR]   symbol:   method builder()
[ERROR]   location: class com.example.MyClass

หลังจากที่ได้อ่านทุกคำตอบที่ฉันสามารถหาเกี่ยวกับ QueryDSL / JPA / Hibernate / ลอมบอก / IntelliJ / Maven ปัญหาจะไม่มีประโยชน์ผมทำงานออกมาว่าผู้กระทำผิดเป็นคนเดียวที่นำเข้าแบบคงที่ของ@Getterวิธีการที่ถูกข้อเขียนบนสนามคงที่

สปริง 1.15.14 RELEASE, Intellij 2019.1.1

@SpringBootApplication
public class BarApplication implements ApplicationContextAware {
  @Getter
  private static ApplicationContext applicationContext;

  // ... start Spring application, and grab hold of ApplicationContext as it comes past
}
import ...
import static BarApplication.getApplicationContext;

@Slf4j
public class IMakeItAllFail {
   public IMakeItAllFail() {
      log.info("{}", getApplicationContext());
   }
}
@Slf4j
public class Foo {
  Foo() {
    log.info("I fail to compile but I have nothing to do with the other classes!");
  }
}

1

ไม่ใช่ปัญหา IntelliJ หากคุณลองภายใต้คอนโซลเรียกใช้การติดตั้ง mvnและหยุดทำงาน คำอธิบายประกอบทั้งหมดจากlombok.externจำเป็นต้องเพิ่มการอ้างอิง แพ็คเกจนี้จัดกลุ่มคำอธิบายประกอบถัดไป:

  • CommonsLog
  • ฟล็อกเกอร์
  • บันทึก
  • JBossLog
  • Log4
  • Log4j2
  • Slf4j
  • XSlf4j

ตัวอย่างเช่นสำหรับ Slf4j จำเป็นต้องเพิ่มการอ้างอิงนี้ในpom.xmlของคุณ

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

0

หลังจากเปิดใช้งานโปรเซสเซอร์คำอธิบายประกอบและติดตั้งปลั๊กอิน lombok แล้วก็ยังใช้งานไม่ได้ เราแก้ไขปัญหานี้ด้วยการตรวจสอบตัวเลือก Idea "Delegate IDE build to gradle"


0

สิ่งที่แยกออกสำหรับฉันคือการทำเครื่องหมายในช่อง "ใช้ปลั๊กอินรีจิสทรี" ในการตั้งค่า Maven

เส้นทางคือ File -> Preferences -> Build, Execution, Deployment -> Build Tools -> Maven



0

ฉันมีปลั๊กอิน Lombok เปิดใช้งานคำอธิบายประกอบมันกำลังรวบรวมจากบรรทัดคำสั่ง - ทุกอย่างและยังไม่เห็นโครงการของฉันเป็น maven (การอ้างอิง maven ทั้งหมดเป็นสีแดงในไฟล์ต้นฉบับ) จากนั้นฉันคลิก SHIFT สองครั้งและค้นหา 'maven' และในบรรดาผลลัพธ์มี 'โหลดโครงการ Maven ทั้งหมดอีกครั้ง' หลังจากเรียกใช้แท็บ Maven ปรากฏขึ้นและฉันสามารถรวบรวมได้และการขีดเส้นใต้สีแดงทั้งหมดในซอร์สโค้ดก็หายไป


0

สิ่งง่ายๆ แต่ฉันคิดออกคือฉันพลาดการเพิ่ม@Logในชั้นเรียน

@Log
public class YourClassName {


}

มันอาจช่วยใครบางคนได้


0

ฉันมีปัญหาเดียวกัน ฉันใช้ gradle และ IDEA;

ปรากฎว่ามันเกิดจาก gradle ผิดรุ่น

ใน gradle \ wrapper \ gradle-wrapper.properties มันคือ:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip

อย่างไรก็ตามฉันระบุเวอร์ชันใน IDEA ให้เป็น

D:\Library\gradle-5.2.1

หลังจากลดเวอร์ชัน gradle เป็น 4.10.x ปัญหาก็หายไป


0

พยายามสร้างlombok.configไฟล์ภายใต้ไดเร็กทอรีฐานของโปรเจ็กต์และระบุlombok.log.fieldNameค่า

ตัวอย่าง: lombok.log.fieldName = LOG

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.