Maven 项目中的 MapStruct 依赖范围

MapStruct dependency scope in a Maven project

MapStruct generates code at compile-time and it should not require any runtime dependencies:

How is MapStruct different from other bean mapping tools?

Unlike most other bean mapping tools, MapStruct doesn’t work at runtime but is a compile-time code generator.

Generating mapping code at build time has many advantages:

  • Excellent performance, as no reflection or byte code generation at runtime is needed; the generated code contains plain method invocations, just as if the mapper was hand-written
  • No runtime dependencies, making MapStruct a great solution for Android applications

Maven项目中应该使用哪个dependency scope?是否应将 MapStruct 作为 提供的 依赖项包括在内?

<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${org.mapstruct.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

org.mapstruct:mapstruct 依赖项包含指示 org.mapstruct:mapstruct-processor 要做什么所需的注释。

它还包含使用默认组件模型时使用的 Mappers 工厂。因此,org.mapstruct:mapstruct 的范围取决于您使用的组件模型:

默认组件模型

如果您正在使用此组件模型,那么如果您正在使用 Mappers 或者如果您在不同的映射器之间存在依赖关系,则在运行时期间需要 org.mapstruct:mapstruct

理论上您可以使用默认组件模型并实例化您自己的映射器。但是,映射器之间的依赖关系仍将使用 Mappers,除非您已经以某种方式在 MyMapper.INSTANCE 中实例化了映射器,然后 MapStruct 将使用 MyMapper.INSTANCE 来获取 MyMapper 的实例].这意味着您仍然可以使用与其他组件模型相同的范围(有关更多信息,请参见下文)

其他组件型号(spring、jsr330、cdi等)

在这种情况下,您在运行时不需要 org.mapstruct:mapstruct,您可以将 <optional>true</optional><scope>provided</scope> 一起使用。

对于 Gradle 这将是 compileOnly 依赖。

注意:使用 Spring Boot 和 <scope>provided</scope> 时要小心,Spring Boot maven 插件仍将在最终提供的 jar 中包含 org.mapstruct:mapstruct 依赖项。您需要通过配置 Spring Boot Maven 插件来忽略它。