簡體   English   中英

如何使用 maven-compiler-plugin 配置 Lombok?

[英]How to configure Lombok with maven-compiler-plugin?

我在項目的maven中有一個根模塊和子模塊。 我正在嘗試使用龍目島。 我已經添加了

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

根 pom.xml。 在子模塊中,我有一個帶有 Lombok 注釋的類。 當我嘗試構建項目時,我得到了很多

找不到標志

我試圖在哪里調用 getter 和 setter。

我嘗試在 root pom 和 sub pom 以及 delombok 中使用具有相同版本(1.16.12)的 lombok -maven-plugin並將我的注釋類移動到 src/main/lombok,我已經查看了幾乎所有問題所以,嘗試所有的變種,但沒有成功。

我正在使用 Maven 3、Java 8、maven-compiler-plugin 和 3.6.1 版本。

我應該如何配置項目才能使用 lombok? 或者也許我做錯了。

這不是對似乎已解決的問題的直接答案,但可以作為未來搜索者的參考:

如果您使用 Dagger(或其他東西)來處理您的注釋,例如

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.15</version>
          </path>
        </annotationProcessorPaths>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    ....
  </plugins>
</build>

您必須將 lombok 添加為路徑

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.15</version>
          </path>

          <!-- SOLUTION --> 
          <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
          </path>


        </annotationProcessorPaths>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    ....
  </plugins>
</build>

您仍然必須將 lombok 列為提供的依賴項。

如果有人使用 JDK 11

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${lombok.version}</version>
                    </path>
                </annotationProcessorPaths>
                <compilerArgs>
                    <arg>-sourcepath</arg>
                    <arg>${project.basedir}/src/main/java${path.separator}${project.basedir}/target/generated-sources/annotations${path.separator}/</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

我正在使用 Java 8 和@Getter(onMethod = @__({@NoSerialization}))@Getter(onMethod = @__({@Translation(messageKey = "translation.key")})) onX 注釋。 duplicate element '<any?>' in annotation @<any?>. 在錯誤輸出中。 看起來來自 Lombok 的人長期以來對 Java 8 有這樣的問題,鏈接到 github 上的問題 Lombok 不處理上面注解中帶有messageKey等參數的注解。 它僅適用於沒有參數的注釋和只有value參數的注釋(當你不寫參數的名稱時)。

我不確定 lombok 和 lombok-maven-plugin 之間有什么區別,但是我的項目配置了這個依賴項:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok-maven-plugin</artifactId>
        <version>1.16.12.0</version>
    </dependency>

我還沒有嘗試過 root 和 submodule pom,因為我的項目都傾向於相互隔離。 不確定這是否會給您帶來問題。

如果您使用的是 Eclipse,您是否運行過 lombok.jar 文件並將其指向您的 eclipse.exe 文件? 它需要修改 .exe 以便 Eclipse 知道這些 getter 和 setter 即將到來,這樣 Eclipse 就不會在開發過程中抱怨。

編輯:我正在使用 maven-compiler-plugin:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

我遇到了同樣的問題,但沒有任何效果,即 maven 插件版本、annotationProcessorPaths、提供的范圍等。

最后,我將其范圍縮小為從同一項目中的一個類對@UtilityClass方法進行靜態導入,即不從依賴項中引入。 這導致注釋處理失敗,即使對於不相關的類也是如此,並且看起來像 lombok 代碼沒有正確編譯。 擺脫靜態導入使一切正常。

Github 上有一個未解決的問題,盡管顯然很難解決。

Maven Groovy 和 Java + Lombok

這個堆棧溢出答案的解決方案對我有用。 我之前錯過了添加 javaAgentClass

如果 maven 構建在訪問項目 lombok 注釋方法時找不到符號,那么我們必須顯式將annotationProcessorPaths配置到maven-compiler-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${lombok.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

上面的解決方案對我來說就像一個魅力!

在使用之前的答案進行了一些實驗之后,這是我對使用ListAppender而不使用Rule的簡單示例的總結:

package example;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.LoggerFactory;

import static org.junit.jupiter.api.Assertions.assertEquals;

class AllMineTest {
    AllMine allMine = new AllMine();
    Logger logger = (Logger)         
    LoggerFactory.getLogger(AllMine.class.getName());
    ListAppender<ILoggingEvent> appender = new ListAppender<>();

    @BeforeEach
    public void setUp() {
        logger.addAppender(appender);
        appender.start();
    }

    @AfterEach
    private void teardown() {
        appender.stop();
        appender.list.clear();
        logger.detachAppender(appender);
    }

    @Test
    void shouldWriteLogs() {
        // When:
        allMine.writeLogs();
        // Then:
        List<String> logMessages = appender.list.stream()
            .map(ILoggingEvent::getMessage)
            .collect(Collectors.toList());
        assertEquals("Dogs are great", logMessages.get(0));
        assertEquals("I prefer cats", logMessages.get(1));
    }
}

對於我的生產班:

package example;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class AllMine {
    public void writeLogs() {
        log.info("Dogs are great");
        log.info("I prefer cats");
    }
}

我不需要 POM 中provided的范圍,但需要 YMMV:

<?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>example-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <properties>
    <java.version>11</java.version>
    <lombok.version>1.18.12</lombok.version>
    <maven-plugin.version>3.8.1</maven-plugin.version>
    <slf4j.version>1.7.30</slf4j.version>
    <junit.version>5.7.2</junit.version>
    <logback.version>1.2.3</logback.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>${junit.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-plugin.version}</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <annotationProcessorPaths>
            <path>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <version>${lombok.version}</version>
            </path>
          </annotationProcessorPaths>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

利用:

<scope>provided</scope>

在 pom.xml 中是這樣的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM