【问题标题】:How to configure Lombok with maven-compiler-plugin?如何使用 maven-compiler-plugin 配置 Lombok?
【发布时间】: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 命令

标签: java maven lombok maven-compiler-plugin


【解决方案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”。
【解决方案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
            猜你喜欢
            • 2013-01-14
            • 2015-01-18
            • 1970-01-01
            • 1970-01-01
            • 2016-05-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多