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 类