Mapstruct Java11 兼容吗?
Is Mapstruct Java11 compatible?
我有点困惑。有一些文档说 java 9 是 "experimental":
https://mapstruct.org/documentation/stable/reference/html/#_using_mapstruct_on_java_9
我发现 post 一个人在 Java 10 中遇到了麻烦。所以我们正前往 java 11,我想知道 Mapstuct 是否可以在其中工作环境。具体来说,它会在编译时生成代码并且生成的代码在那里工作吗(我想后者会)。
是的,它适用于 Java 11 / Spring Boot 2 项目,我们使用 Mapstruct 没有问题。
是的,这是可能的,尽管我在将 DropWizard 项目 (1.3.7) 迁移到 java 时遇到了一些困难 11. 文档中建议的配置(通过 maven-compiler-plugin
) 对我不起作用(没有显示错误,但未生成映射器 class)所以我不得不使用 maven-processor-plugin v3.3.3
.
我是这样做到的:
使用 <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
添加依赖项
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>provided</scope>
</dependency>
然后在子模块中配置插件如下
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>3.3.3</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<processors>
<!-- list of processors to use -->
<processor>org.mapstruct.ap.MappingProcessor</processor>
</processors>
<outputDirectory>${basedir}/target/generated-sources-mappers</outputDirectory>
<compilerArguments>-source 11 -target 11</compilerArguments>
</configuration>
</execution>
</executions>
</plugin>
outputDirectory
是我们项目特有的东西,但我留在那里是为了强调 xml 标签从 te 插件的 2.x 版本更改的事实,以防你是从那里迁移。
compilerArguments
部分是必需的,因为插件 运行 javac
传递 java 版本 1.6 作为默认参数,如果您使用 lambda 表达式,这将不起作用或该语言的其他新功能。
编译时一定要注意插件的输出,它应该只显示警告,否则不会生成你的classes,你会得到一个通用的ClassNotFound
异常,但原因可能是您的插件无法正常编译。
[INFO] --- maven-processor-plugin:3.3.3:process
...
7 warnings
还要确保您的 class 路径中没有任何早于 1.3.0.Final
的 mapstruct 库版本,这也会导致无法生成 classes 的问题。
我为 JDK11 使用了以下配置
<properties>
<mapstruct.version>1.3.1.Final</mapstruct.version>
<maven.compiler.version>3.6.1</maven.compiler.version>
</properties>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
然后mvn clean install会在target\generated-sources\annotations
中生成impl 类
我有点困惑。有一些文档说 java 9 是 "experimental":
https://mapstruct.org/documentation/stable/reference/html/#_using_mapstruct_on_java_9
我发现 post 一个人在 Java 10 中遇到了麻烦。所以我们正前往 java 11,我想知道 Mapstuct 是否可以在其中工作环境。具体来说,它会在编译时生成代码并且生成的代码在那里工作吗(我想后者会)。
是的,它适用于 Java 11 / Spring Boot 2 项目,我们使用 Mapstruct 没有问题。
是的,这是可能的,尽管我在将 DropWizard 项目 (1.3.7) 迁移到 java 时遇到了一些困难 11. 文档中建议的配置(通过 maven-compiler-plugin
) 对我不起作用(没有显示错误,但未生成映射器 class)所以我不得不使用 maven-processor-plugin v3.3.3
.
我是这样做到的:
使用 <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>provided</scope>
</dependency>
然后在子模块中配置插件如下
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>3.3.3</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<processors>
<!-- list of processors to use -->
<processor>org.mapstruct.ap.MappingProcessor</processor>
</processors>
<outputDirectory>${basedir}/target/generated-sources-mappers</outputDirectory>
<compilerArguments>-source 11 -target 11</compilerArguments>
</configuration>
</execution>
</executions>
</plugin>
outputDirectory
是我们项目特有的东西,但我留在那里是为了强调 xml 标签从 te 插件的 2.x 版本更改的事实,以防你是从那里迁移。compilerArguments
部分是必需的,因为插件 运行javac
传递 java 版本 1.6 作为默认参数,如果您使用 lambda 表达式,这将不起作用或该语言的其他新功能。
编译时一定要注意插件的输出,它应该只显示警告,否则不会生成你的classes,你会得到一个通用的ClassNotFound
异常,但原因可能是您的插件无法正常编译。
[INFO] --- maven-processor-plugin:3.3.3:process
...
7 warnings
还要确保您的 class 路径中没有任何早于 1.3.0.Final
的 mapstruct 库版本,这也会导致无法生成 classes 的问题。
我为 JDK11 使用了以下配置
<properties>
<mapstruct.version>1.3.1.Final</mapstruct.version>
<maven.compiler.version>3.6.1</maven.compiler.version>
</properties>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
然后mvn clean install会在target\generated-sources\annotations
中生成impl 类