如何让Lombok和AspectJ一起工作?

28

我刚刚在SO上发布了这个问题,关于Lombok未生成我的getter/setter。事实证明它与AspectJ产生了冲突。如果我禁用AspectJ,那么getter/setter将被适当地生成。

我的猜测是ajc编译器无法识别lombok。

Lombok和AspectJ是否互斥?这两种技术能否共同使用?


这个网站可能会有所帮助。但是你应该更准确地描述你正在做什么(Eclipse?Maven?还是其他?)。 - maaartinus
谢谢提供的链接,这确实是一个有用的建议,但对于更复杂的AJ项目(例如:ITD、成员注入、接口实现等),我不认为这个解决方案会起作用。所提出的想法要求在ajc之前运行javac,但是javac将无法处理使用注入成员/接口等的任何文件,因此,ajc将没有任何字节码可用。至少,这是我的理论;我还没有尝试过以确保它是否可行。 - Eric B.
这篇文章对我很有帮助,当我把aspectj依赖库和lombok添加到项目中遇到问题时。https://palesz.wordpress.com/2011/12/03/howto-maven-lombok-and-aspectj-together/ - Volodymyr Masliy
3个回答

9

根据AspectJ维护者Andy Clement的说法,目前存在问题是由于将ECJ(Eclipse Compiler for Java)包包含并重命名为AspectJ编译器基础设施所导致。

有关更多信息,请参考AspectJ用户邮件列表中Eric B.和A. Clement之间的讨论:

也许我们可以通过这个答案来关闭此问题,并在问题解决后进行报告。


1
遇到了类似的问题。你有找到任何可行的解决方案吗? - santhosh kumar
我的回答哪里不清楚了吗?你有看邮件列表的讨论吗? - kriegaex
很酷,是的我有。实际上我曾经问过 @Eric B 是否得到了任何解决方案(问题、答案和邮件线程都在2014年)。 - santhosh kumar
@santhoshkumar 很抱歉回复晚了,我没有看到通知/线程。我从未找到可行的解决方案来解决这个问题,最终放弃了Lombok,部分原因是由于这个限制。我看到@ChengT发布了一个解决方案(AspectJ支持对我来说更重要)。虽然我从技术角度不理解为什么那样会起作用,但我将来会尝试再次使用。 - Eric B.

0

2022年 - AWS文档中的Lambda Powertools FAQ中有对此的答案:https://awslabs.github.io/aws-lambda-powertools-java/FAQs/

要启用原地编织功能,您需要使用以下aspectj-maven-plugin配置:

<configuration>
    <forceAjcCompile>true</forceAjcCompile> 
    <sources/>
    <weaveDirectories>
        <weaveDirectory>${project.build.directory}/classes</weaveDirectory>
    </weaveDirectories>
    ...
    <aspectLibraries>
        <aspectLibrary>
            <groupId>software.amazon.lambda</groupId>
            <artifactId>powertools-logging</artifactId>
        </aspectLibrary>
    </aspectLibraries>
</configuration>

-2
将Project Lombok作为依赖项添加到aspectj-maven-plugin中,如下所示:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>compile</scope>
</dependency>

例如:

<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.8</version>
        <dependencies>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>${aspectj.version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjtools</artifactId>
                <version>${aspectj.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.18</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
        <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <complianceLevel>${java.version}</complianceLevel>
            <encoding>${project.build.sourceEncoding}</encoding>
            <verbose>true</verbose>
            <privateScope>true</privateScope>
            <showWeaveInfo>true</showWeaveInfo>
            <outxml>true</outxml>
        </configuration>
        <executions>
            <execution>
                <phase>compile</phase>
                <goals>
                    <goal>compile</goal>
                    <goal>test-compile</goal>
                </goals>
                <configuration>
                    <aspectLibraries combine.self="override">
                        <aspectLibrary>
                            <groupId>org.springframework</groupId>
                            <artifactId>spring-aspects</artifactId>
                        </aspectLibrary>
                    </aspectLibraries>
                </configuration>
            </execution>
        </executions>
    </plugin>

我尝试了这个方法,但对我没有用。在Eclipse中没有任何变化,而Maven从AJC报错:“您未使用Lombok支持的编译器”。 - DavidA
也无法使用此方法重新创建修复。 - Maleki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接