使用 iso-8859-1 在 wildfly 中打开 ucanaccess/jackcess 数据库
Open ucanaccess/jackcess database in wildfly using iso-8859-1
我连接到 wildfly 9.0.2 中定义的 MS Access 2000 数据库。工作正常。使用命令行 UCanAccess,我 运行 它与 -Dfile.encoding=ISO-8859
以便在 Ubuntu 上正确显示国家字符(挪威语)。在 OS X 上,命令行可以在没有任何 jre 选项的情况下正确显示国家字符。然而,Wildlfy 实例也在 运行ning OS X 上,并且不正确显示国家字符(目前它们只是在简单测试中写入控制台)在任何 [=31 中使用 UcanAccess-driver =] 基于 sql 的客户端,例如 DBeaver 或 SQLSquirrel "just works",当涉及到字符集时。但是通过JPA和wildfly查询数据库,国字被替换成'?'
所以,有一种方法可以在 jdbc-url 上为 Jackcess 指定一个特定的 "opener":
......mdb;jackcessOpener=ucaextension.JackcessWithCharsetISO88591Opener
其中 "opener" 看起来像这样:
public class JackcessWithCharsetISO88591Opener implements JackcessOpenerInterface {
public Database open(File f, String pwd) throws IOException {
DatabaseBuilder db = new DatabaseBuilder(f);
db.setCharset(Charset.forName("ISO-8859-1"));
try {
db.setReadOnly(false);
return db.open();
} catch (IOException e) {
db.setReadOnly(true);
return db.open();
}
}
}
(是的,异常处理至少应该发出一个 warning。)
所以我将其打包为 jar 文件 (maven),删除了 wildfly 中的旧连接、驱动程序和模块定义。然后我添加了这个 jar 文件,以及 ucanaccess 模块的其他文件(ucanaccess 本身,hsqldb 等),重新创建驱动程序和连接,现在使用 opener 参数,并重新部署 war 使用它。但是野蝇抱怨:
Caused by: java.lang.ClassNotFoundException: ucaextension.JackcessWithCharsetISO88591Opener from [Module "com.ucanaccess:main" from local module loader @1060b431 (finder: local module finder @612679d6 (roots: /Users/jonmartinsolaas/Local/wildfly-9.0.2.Final/modules,/Users/jonmartinsolaas/Local/wildfly-9.0.2.Final/modules/system/layers/base))]
很明显 url 参数已被拾取,但未找到 class,即使它与驱动程序的其他 jar 一起部署。 class 实际上在 jar 文件中。但是我是否需要从其他罐子或其他东西中的任何其他 MANIFEST.INF class 路径引用它?
情况好像是各种主机不显示国字。那,以及我实际上必须在 ubuntu 命令行上指定字符集 运行 的事实,使我相信存在问题,并且实际上在浏览器中而不是在日志记录控制台中显示数据只显示那。不需要特定字符集的 jackcess "opener"。
我连接到 wildfly 9.0.2 中定义的 MS Access 2000 数据库。工作正常。使用命令行 UCanAccess,我 运行 它与 -Dfile.encoding=ISO-8859
以便在 Ubuntu 上正确显示国家字符(挪威语)。在 OS X 上,命令行可以在没有任何 jre 选项的情况下正确显示国家字符。然而,Wildlfy 实例也在 运行ning OS X 上,并且不正确显示国家字符(目前它们只是在简单测试中写入控制台)在任何 [=31 中使用 UcanAccess-driver =] 基于 sql 的客户端,例如 DBeaver 或 SQLSquirrel "just works",当涉及到字符集时。但是通过JPA和wildfly查询数据库,国字被替换成'?'
所以,有一种方法可以在 jdbc-url 上为 Jackcess 指定一个特定的 "opener":
......mdb;jackcessOpener=ucaextension.JackcessWithCharsetISO88591Opener
其中 "opener" 看起来像这样:
public class JackcessWithCharsetISO88591Opener implements JackcessOpenerInterface {
public Database open(File f, String pwd) throws IOException {
DatabaseBuilder db = new DatabaseBuilder(f);
db.setCharset(Charset.forName("ISO-8859-1"));
try {
db.setReadOnly(false);
return db.open();
} catch (IOException e) {
db.setReadOnly(true);
return db.open();
}
}
}
(是的,异常处理至少应该发出一个 warning。)
所以我将其打包为 jar 文件 (maven),删除了 wildfly 中的旧连接、驱动程序和模块定义。然后我添加了这个 jar 文件,以及 ucanaccess 模块的其他文件(ucanaccess 本身,hsqldb 等),重新创建驱动程序和连接,现在使用 opener 参数,并重新部署 war 使用它。但是野蝇抱怨:
Caused by: java.lang.ClassNotFoundException: ucaextension.JackcessWithCharsetISO88591Opener from [Module "com.ucanaccess:main" from local module loader @1060b431 (finder: local module finder @612679d6 (roots: /Users/jonmartinsolaas/Local/wildfly-9.0.2.Final/modules,/Users/jonmartinsolaas/Local/wildfly-9.0.2.Final/modules/system/layers/base))]
很明显 url 参数已被拾取,但未找到 class,即使它与驱动程序的其他 jar 一起部署。 class 实际上在 jar 文件中。但是我是否需要从其他罐子或其他东西中的任何其他 MANIFEST.INF class 路径引用它?
情况好像是各种主机不显示国字。那,以及我实际上必须在 ubuntu 命令行上指定字符集 运行 的事实,使我相信存在问题,并且实际上在浏览器中而不是在日志记录控制台中显示数据只显示那。不需要特定字符集的 jackcess "opener"。