描述:
我注意到官方 MapStruct 文档和有关如何配置
mapstruct-processor
的各种教程之间存在差异。在某些教程中,mapstruct-processor
作为常规依赖项添加到 <dependencies>
下。然而,官方文档使用 <maven-compiler-plugin>
将其放置在 <annotationProcessorPaths>
中。
我的问题是:
<dependencies>
下列出依赖项才能让 Maven 下载并使用它?mapstruct-processor
仅在<plugin>
内部指定,Maven如何确保它被正确下载和使用?我试图理解这些配置背后的基本原理及其含义。
这两种方式都是有效的(但不要混合使用),所以问题1的答案是否定的,你不必将其添加为依赖项,但是你必须将其添加到
maven-compiler-plugin
。
问题2的答案可以在https://github.com/apache/maven-compiler-plugin/blob/a1415aa3833df5985ecdc2b854ef516d3afbf348/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java找到#L1672对于最新版本(3.13.0):插件要求 Maven 这样做。
问题3的答案有点长。两种方法都使用相同的机制 - 资源
META-INF/services/javax.annotation.processing.Processor
,其中包含 JAR 提供的注释处理器列表。最大的区别是 JAR 文件中类的可用性。如果将 mapstruct-processor
添加到 maven-compiler-plugin
,则 JAR 文件中的类仅可用于注释处理。您不能在源代码中使用它们,并且它们在运行时不可用。就您的项目而言,它们不存在。另一方面,如果您添加 mapstruct-processor
作为依赖项,则这些类在运行时或两者均可用于源代码,具体取决于范围(provided
、runtime
或 compile
)。您不需要它,因此根据 MapStruct 本身的建议方法是将其添加到 maven-compiler-plugin
。这样您就不会最终在源代码中使用它或意外地将其与您的应用程序捆绑在一起。