使用OpenRewrite迁移Java8至Java11时遇字符集错误求助
使用OpenRewrite迁移Java8到Java11时编码报错的解决方法
在多模块Maven项目中采用ISO-8859-1编码,按照官方指南配置OpenRewrite插件执行Java8到Java11迁移时,执行Maven目标出现终止报错:
The contents of a quark are unknown, so the charset is unknown.
问题原因
这个报错核心是OpenRewrite未正确识别项目的文件编码,当项目使用非UTF-8编码(比如ISO-8859-1)时,处理文件容易触发字符集解析异常。
解决办法
- 方法1:在OpenRewrite插件中直接指定编码
修改父POM里的插件配置,添加<encoding>参数明确指定项目编码:
<project> <build> <plugins> <plugin> <groupId>org.openrewrite.maven</groupId> <artifactId>rewrite-maven-plugin</artifactId> <version>4.41.0</version> <configuration> <activeRecipes> <recipe>org.openrewrite.java.migrate.Java8toJava11</recipe> </activeRecipes> <!-- 明确指定项目编码为ISO-8859-1 --> <encoding>ISO-8859-1</encoding> </configuration> <dependencies> <dependency> <groupId>org.openrewrite.recipe</groupId> <artifactId>rewrite-migrate-java</artifactId> <version>1.17.1</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>
- 方法2:在父POM全局配置编码
如果多模块项目编码统一,可在父POM的<properties>中添加全局编码设置,让所有Maven插件(包括OpenRewrite)都遵循该编码:
<properties> <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding> <project.reporting.outputEncoding>ISO-8859-1</project.reporting.outputEncoding> </properties>
- 方法3:跳过无法识别的特殊文件
如果项目里有二进制文件、非标准文本文件这类无法识别编码的文件,可以在插件配置中添加排除规则跳过它们:
<configuration> <activeRecipes> <recipe>org.openrewrite.java.migrate.Java8toJava11</recipe> </activeRecipes> <encoding>ISO-8859-1</encoding> <excludes> <exclude>**/*.bin</exclude> <exclude>**/特殊格式文件.txt</exclude> </excludes> </configuration>
验证
修改配置后,重新执行OpenRewrite的Maven目标(比如mvn rewrite:run),确认报错消失,迁移流程正常执行。
内容的提问来源于stack exchange,提问作者Marco Fantasia
相关产品推荐
相关产品推荐

