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

Posted

技术标签:

【中文标题】如何使用 maven-compiler-plugin 配置 Lombok?【英文标题】:How to configure Lombok with maven-compiler-plugin? 【发布时间】:2017-07-04 14:04:01 【问题描述】:

我在项目的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 中使用具有相同版本 (1.16.12) 的 lombok-maven-plugin 以及 delombok 并将我的注释类移动到 src/main/ lombok,我几乎浏览了SO中的所有问题,尝试了所有变体,但没有成功。

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

我应该如何配置项目才能使用 lombok?或者我做错了什么。

【问题讨论】:

您是否将其添加为依赖项?您需要将其配置为要在编译插件之前执行的插件:awhitford.github.io/lombok.maven/lombok-maven-plugin/usage.html 你用的是什么IDE? 你是如何构建你的项目的?你在使用 IDE 吗?您是否尝试过直接使用 maven 构建它? @wemu 是的,我也尝试过使用插件:&lt;plugin&gt; &lt;groupId&gt;org.projectlombok&lt;/groupId&gt; &lt;artifactId&gt;lombok-maven-plugin&lt;/artifactId&gt; &lt;version&gt;1.16.12.0&lt;/version&gt; &lt;executions&gt; &lt;execution&gt; &lt;phase&gt;generate-sources&lt;/phase&gt; &lt;goals&gt; &lt;goal&gt;delombok&lt;/goal&gt; &lt;/goals&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt; 我还把带注释的类放在 src/main/lombok 而不是 src/main/java @MicheleDaRos IDE 无关紧要。我正在运行 Maven 命令 【参考方案1】:

这不是对似乎已解决的问题的直接答案,但可以作为未来搜索者的参考:

如果您使用 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 列为提供的依赖项。

【讨论】:

这是我的解决方案。我没有使用 dagger 而是使用 mapstruct-processor,并且在编译时我无法识别“set”和“get”。在插件中也添加lombok,它在构建和编译时间都标识了“set”和“get”。 也许将此答案移至***.com/questions/50361786/using-dagger2-with-lombok【参考方案2】:

如果有人使用 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>

【讨论】:

【参考方案3】:

我使用的是 Java 8 和 @Getter(onMethod = @__(@NoSerialization))@Getter(onMethod = @__(@Translation(messageKey = "translation.key"))) onX 注释。我在错误输出中得到duplicate element '&lt;any?&gt;' in annotation @&lt;any?&gt;.。看起来来自 Lombok 的人很长一段时间以来都对 Java 8 有这样的问题link to issue on github。 Lombok 不处理上面注解中带有 messageKey 等参数的注解。它仅适用于没有参数的注释和只有value 参数的注释(当你不写参数的名称时)。

【讨论】:

@AJT_82 这不是一个新问题,它是请求帮助的真实答案(如果将来有人会在 Lombok 支持此类注释时查看此问题)。所以你应该删除-1票。 我没有投反对票。但是您可能会因为您的答案中有问题(这是不允许的)而被否决了。现在您已经格式化了答案,现在它似乎是一个正确的答案:) 这是由于 javac 中的一个错误。我们找到了解决这个问题的方法。您可以通过以下方式跟踪我们的进度并关注讨论:github.com/rzwitserloot/lombok/issues/778【参考方案4】:

我不确定 lombok 和 lombok-maven-plugin 之间有什么区别,但是我的项目配置了这个依赖项:

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

我还没有尝试过 root 和子模块 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-compile-plugin 吗? IDE 无所谓。 看起来 Lombok 无法使用 maven-compiler-plugin 和 @Getter(onMethod = @__(@Translation(messageKey = "translation.key"))) 之类的注释。我收到 cannot find symbol symbol: class __ 编译错误。但它适用于@Getter(onMethod = @__(@NoSerialization))-like 注释 @O.Zaiats 鉴于您关于 @Getter(onMethod = @__... 的帖子,我怀疑我的配置可能对您没有帮助,因为我没有使用该注释,并且错误报告您链接清楚地表明它是该注释语法和 Java 1.8 所特有的。对于它的价值,我使用的是 JDK 1.8.0_60 和 Maven 3.3.9(嵌入在 Eclipse Neon 中)。【参考方案5】:

我遇到了同样的问题,但没有任何效果,即 maven 插件版本、annotationProcessorPaths、提供的范围等。

最后,我将范围缩小到从同一项目中的一个类中对 @UtilityClass 方法进行静态导入,即不从依赖项中引入。这导致注释处理失败,即使对于不相关的类也是如此,并且看起来像 lombok 代码没有被正确编译。摆脱静态导入后一切正常。

在 Github 上有一个未解决的问题,尽管它显然很难解决。

【讨论】:

【参考方案6】:

Maven Groovy and Java + Lombok

这个堆栈溢出答案的解决方案对我有用。我错过了之前添加的 javaAgentClass

【讨论】:

【参考方案7】:

如果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>

以上解决方案对我来说就像一个魅力!

【讨论】:

【参考方案8】:

在使用之前的答案进行了一些实验之后,这是我使用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>

【讨论】:

【参考方案9】:

使用:

<scope>provided</scope>

在 pom.xml 中这样:

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

【讨论】:

虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 @RafaelLemes 正如您在我的问题中看到的,我使用了 provided

以上是关于如何使用 maven-compiler-plugin 配置 Lombok?的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?