带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(8)https://developer.aliyun.com/article/1339756?groupCode=taobaotech
MapStruct是如何与Lombok共存的?
查阅MapStruct官方文档可以发现这样一段内容:
其中提到,MapStruct的annotation processor必须在Lombok的annotation processor生成完代码之后,才可以正常运行。
所以,这应该就是在导入dependencies时,必须先导入Lombok包,再导入MapStruct-processor包才可以正常运行的原因了。不过还有个问题没有解决:
Maven到底在哪里规定了annotation processor的载入顺序?难道每次创建工程时,必须记住这些包导入顺序么?
MapStruct官方推荐的导入流程
在进一步查看MapStruct官网时发现,其并没有将MapStruct-processor放在dependencies中,而是放在了 annotationProcessorPaths层级下:
https://mapstruct.org/documentation/installation/
... <properties> <org.mapstruct.version>1.5.2.Final</org.mapstruct.version> </properties> ... <dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${org.mapstruct.version}</version> </dependency> </dependencies> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <!-- depending on your project --> <target>1.8</target> <!-- depending on your project --> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> <!-- other annotation processors --> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
这又是为什么呢?
查阅Maven官方文档,对于有这样一段描述:
If specified, the compiler will detect annotation processors only in those classpath elements. If omitted, the default classpath is used to detect annotation processors. The detection itself depends on the configura- tion of annotationProcessors.
即如果有层级,则使用这个层级声明注解处理器的顺序执行,如果没有,则按照默 认classpath的顺序来使用注解处理器。
地址:https://maven.apache.org/plugins/maven-compiler-plugin/com-pile-mojo.html#annotationProcessorPaths
地址:https://maven.apache.org/plugins/maven-compiler-plugin/com-pile-mojo.html#annotationProcessorPaths
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(10) https://developer.aliyun.com/article/1339754?groupCode=taobaotech