关于java:如何使用maven-compiler-plugin配置Lombok?

How to configure Lombok with maven-compiler-plugin?

我在项目的maven中有一个根模块和子模块。 我正在尝试使用龙目岛。
我已经添加了

1
2
3
4
5
6
<dependency>
    <groupId>org.projectlombok</groupId>
    lombok</artifactId>
    <version>1.16.12</version>
    <scope>provided</scope>
</dependency>

根pom.xml。
在子模块中,我有一个带有Lombok批注的类。
当我尝试建立项目时,我得到了很多

cannot find symbol

我试图在这里打电话给getters和setters。

我试图在根pom和子pom中使用具有相同版本(1.16.12)的lombok-maven-plugin以及delombok,并将带注释的类移至src / main / lombok,我已经研究了几乎所有问题 因此,请尝试所有变体,但不会成功。

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

我应该如何配置项目以使用lombok? 也许我做错了什么。


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

如果您使用Dagger(或其他工具)来处理注释,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
       
          <path>
            <groupId>com.google.dagger</groupId>
            dagger-compiler</artifactId>
            <version>2.15</version>
          </path>
        </annotationProcessorPaths>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    ....
  </plugins>
</build>

您必须添加lombok作为路径,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
       
          <path>
            <groupId>com.google.dagger</groupId>
            dagger-compiler</artifactId>
            <version>2.15</version>
          </path>

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


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

您仍然必须将lombok列为提供的依赖项。


如果有人使用JDK 11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
               
                    <path>
                        <groupId>org.projectlombok</groupId>
                        lombok</artifactId>
                        <version>${lombok.version}</version>
                    </path>
                </annotationProcessorPaths>
                <compilerArgs>
                    -sourcepath</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 '' in annotation @.。看起来来自Lombok的人在Java 8上有这样的问题,很长一段时间才链接到github上。 Lombok不会在上面的注释中处理带有messageKey之类的参数的注释。它仅适用于不带参数的注释和仅具有value参数的注释(当您不写参数名称时)。


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

1
2
3
4
5
    <dependency>
        <groupId>org.projectlombok</groupId>
        lombok-maven-plugin</artifactId>
        <version>1.16.12.0</version>
    </dependency>

我还没有尝试过root和submodule poms,因为我的项目都倾向于彼此隔离。不知道这是否会给您造成问题。

如果使用的是Eclipse,是否已运行lombok.jar文件并将其指向eclipse.exe文件?它需要修改.exe,以使Eclipse知道这些getter和setter即将到来,以便Eclipse在开发过程中不会抱怨。

编辑:
我正在使用maven-compiler-plugin:

1
2
3
4
5
6
7
8
9
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>


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

最后,我将其范围缩小为从同一项目中的类对@UtilityClass方法进行静态导入,即未从依赖项引入。甚至对于不相关的类,这也导致注释处理失败,并且看起来好像龙目岛代码只是未正确编译。摆脱静态导入就可以完成所有工作。

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


Maven Groovy和Java +龙目岛

这个堆栈溢出答案的解决方案为我工作。我错过了前面添加javaAgentClass的机会


用:

1
<scope>provided</scope>

在pom.xml中是这样的:

1
2
3
4
5
6
7
8
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
    </dependency>
</dependencies>