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 插件来忽略它。
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 插件来忽略它。