A Java library that automatically plugs into your editor and build tools, reducing boilerplate code through annotations
npx @tessl/cli install tessl/maven-org-projectlombok--lombok@1.18.0Project Lombok is a Java library that automatically plugs into your editor and build tools, reducing boilerplate code through compile-time annotation processing. It eliminates the need to write repetitive code like getters, setters, constructors, equals, hashCode, and toString methods by generating them automatically at compile time through annotations.
org.projectlombok:lombokpom.xml or Gradle build.gradleMaven:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
<scope>provided</scope>
</dependency>Gradle:
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.38'
annotationProcessor 'org.projectlombok:lombok:1.18.38'
}import lombok.*;
import lombok.experimental.*;
import lombok.extern.slf4j.Slf4j;Individual imports:
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.Builder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;import lombok.Data;
import lombok.NonNull;
@Data
public class Person {
@NonNull
private String name;
private int age;
private String email;
}
// Usage
Person person = new Person("John Doe", 30, "john@example.com");
System.out.println(person.getName()); // Generated getter
person.setAge(31); // Generated setter
System.out.println(person.toString()); // Generated toStringLombok operates through several key mechanisms:
Comprehensive annotations for creating data classes with minimal boilerplate. Perfect for POJOs, DTOs, and value objects.
@Target(ElementType.TYPE)
@interface Data {
String staticConstructor() default "";
}
@Target(ElementType.TYPE)
@interface Value {
String staticConstructor() default "";
}Automatic constructor generation with various configurations for different use cases including dependency injection and immutable objects.
@Target(ElementType.TYPE)
@interface NoArgsConstructor {
String staticName() default "";
AccessLevel access() default AccessLevel.PUBLIC;
boolean force() default false;
AnyAnnotation[] onConstructor() default {};
}
@Target(ElementType.TYPE)
@interface AllArgsConstructor {
String staticName() default "";
AccessLevel access() default AccessLevel.PUBLIC;
AnyAnnotation[] onConstructor() default {};
}
@Target(ElementType.TYPE)
@interface RequiredArgsConstructor {
String staticName() default "";
AccessLevel access() default AccessLevel.PUBLIC;
AnyAnnotation[] onConstructor() default {};
}Getter and setter generation with access level control, lazy loading, and method annotation support.
@Target({ElementType.FIELD, ElementType.TYPE})
@interface Getter {
AccessLevel value() default AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
boolean lazy() default false;
}
@Target({ElementType.FIELD, ElementType.TYPE})
@interface Setter {
AccessLevel value() default AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
AnyAnnotation[] onParam() default {};
}Fluent builder pattern implementation with support for inheritance, default values, and collection handling.
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR})
@interface Builder {
String builderMethodName() default "builder";
String buildMethodName() default "build";
String builderClassName() default "";
boolean toBuilder() default false;
AccessLevel access() default AccessLevel.PUBLIC;
String setterPrefix() default "";
}
@Target(ElementType.FIELD)
@interface Singular {
String value() default "";
boolean ignoreNullCollections() default false;
}Code generation for common Java patterns including null checking, exception handling, synchronization, and immutable updates.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE})
@interface NonNull {}
@Target(ElementType.METHOD)
@interface SneakyThrows {
Class<? extends Throwable>[] value() default {};
}
@Target(ElementType.METHOD)
@interface Synchronized {
String value() default "";
}
@Target({ElementType.FIELD, ElementType.TYPE})
@interface With {
AccessLevel value() default AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
AnyAnnotation[] onParam() default {};
}Automatic logger field generation for major Java logging frameworks with configurable topics and field names.
@Target(ElementType.TYPE)
@interface Slf4j {
String topic() default "";
}
@Target(ElementType.TYPE)
@interface Log {
String topic() default "";
}
@Target(ElementType.TYPE)
@interface Log4j2 {
String topic() default "";
}Advanced and experimental features including utility classes, enhanced builders for inheritance, and field name constants.
@Target(ElementType.TYPE)
@interface UtilityClass {}
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR})
@interface SuperBuilder {
String builderMethodName() default "builder";
String buildMethodName() default "build";
boolean toBuilder() default false;
String setterPrefix() default "";
}
@Target({ElementType.TYPE, ElementType.FIELD})
@interface FieldDefaults {
AccessLevel level() default AccessLevel.NONE;
boolean makeFinal() default false;
}public enum AccessLevel {
PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE, NONE
}// Type inference for local variables
lombok.val finalVar = someExpression(); // final var with inferred type
lombok.var mutableVar = someExpression(); // mutable var with inferred typepublic final class Lombok {
public static RuntimeException sneakyThrow(Throwable t);
public static <T> T preventNullAnalysis(T value);
public static <T> T checkNotNull(T reference, String errorMessage);
}