Spring Boot with Maven 中 data.sql 的编码问题

Encoding issue with data.sql in Spring Boot with Maven

我正在尝试测试包含 Spring Data JPA 实体和存储库的数据访问库。

我的 SpringBootTests 创建了一个数据库并使用模式-test.sql 和数据-test.sql

自动填充它

在我的 application.properties:

spring.datasource.initialization-mode=always
spring.datasource.platform=test
spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=none

在我的数据-test.sql中,我有一些拉丁字符。类似于:

INSERT INTO TABLE
(ID, NAME)
VALUES
(1, 'Donnée');

我的数据-test.sql 文件是 UTF-8 编码的。我用 Vim :se fenc 和 Eclipse 进行了双重检查:

当我从 Eclipse 启动我的 JUnit 测试时,一切正常,我的测试通过了。但是当我从 Eclipse 启动一个 maven 包目标时,我的测试失败了,如下所示:

Expecting:
  <Optional[TableEntity [id=1, name=Donnée]]>
to contain:
  <TableEntity [id=1, name=Donnée]>
but did not.

maven 似乎没有将我的数据-test.sql 文件解释为 UTF-8 编码文件,而是解释为 CP-1252 编码文件。

我在 pom.xml 中添加了以下内容:

<properties>
    <java.version>11</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

还有:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
        <encoding>UTF-8</encoding>
        <!-- Latin1 is still the default for .properties files -->
        <propertiesEncoding>ISO-8859-1</propertiesEncoding>
    </configuration>
</plugin>

在 Eclipse“运行 配置”中,我添加了以下 VM 参数:

-Dfile.encoding=UTF-8

而且我还在“通用”选项卡中强制编码:

在控制台中,我发现:

[DEBUG] Copying file application.properties
[DEBUG] file application.properties has a filtered file extension
[DEBUG] Using 'ISO-8859-1' encoding to copy filtered resource 'application.properties'.
[DEBUG] copy (...)\src\test\resources\application.properties to (...)\target\test-classes\application.properties
[DEBUG] Copying file data-test.sql
[DEBUG] file data-test.sql has a filtered file extension
[DEBUG] Using 'UTF-8' encoding to copy filtered resource 'data-test.sql'.
[DEBUG] copy (...)\src\test\resources\data-test.sql to (...)\target\test-classes\data-test.sql
[DEBUG] Copying file schema-test.sql
[DEBUG] file schema-test.sql has a filtered file extension
[DEBUG] Using 'UTF-8' encoding to copy filtered resource 'schema-test.sql'.
[DEBUG] copy (...)\src\test\resources\schema-test.sql to (...)\target\test-classes\schema-test.sql

是否有隐藏选项强制 Maven 或我的 SpringBootTest class 将 SQL 文件解释为旧的 CP-1252 或 ISO-8859-1 编码?

完整示例可用 on GitHub

显示您的日食属性。 也应该是“UTF-8”。

在数据库中编码

检查 H2 数据库的编码。 所以设置hibernate.hbm2ddl.charset_name = "UTF-8" 当你使用 spring 引导时,你还可以设置如下:

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;

编码问题似乎来自surefire插件。我在 pom.xml 的 <plugins/> 中添加了以下行:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <argLine>-Dfile.encoding=UTF-8</argLine>
        </configuration>
    </plugin>

问题已解决:似乎 surefire 在其自己的 JVM 中启动了测试,采用 ISO-8859-1 编码。

固定项目可用on GitHub