绑定默认 hsql 数据源时启动 Jboss 4.3 时出错

Posted

技术标签:

【中文标题】绑定默认 hsql 数据源时启动 Jboss 4.3 时出错【英文标题】:Error during starting Jboss 4.3 while binding default hsql datasource 【发布时间】:2018-02-12 13:56:17 【问题描述】:

我在 JBoss 启动期间遇到以下错误。

[ServiceController] Problem starting service jboss:service=Hypersonic,database=localDB
java.lang.NoSuchMethodError: org.hsqldb.DatabaseURL.parseURL(Ljava/lang/String;ZZ)Lorg/hsqldb/persist/HsqlProperties;
    at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source)
    at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at org.jboss.jdbc.HypersonicDatabase.getConnection(HypersonicDatabase.java:768)
    at org.jboss.jdbc.HypersonicDatabase.startStandaloneDatabase(HypersonicDatabase.java:618)
    at org.jboss.jdbc.HypersonicDatabase.startService(HypersonicDatabase.java:564)
    at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
    at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
    at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
    at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
    at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
    at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
    at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
    at com.sun.proxy.$Proxy0.start(Unknown Source)
    at org.jboss.system.ServiceController.start(ServiceController.java:417)

背景:我添加了一个新的 MS Access DB 数据源。为此,我正在使用 ucanaccess 库。现在,为了捆绑我的代码,我创建了一个可执行的 uber jar,其中包含我的主要测试程序以及依赖项。依赖包括以下jar:

ucanaccess-4.0.1.jar
commons-lang-2.6.jar
commons-logging-1.1.3.jar
hsqldb-2.3.1.jar
jackcess-2.1.6.jar

此外,我已经在 MSAccess-ds.xml 中配置了我的数据源并部署在部署文件夹中。我将名为“Service-MSAccessDB.jar”的 uber jar 保存在服务器 lib 文件夹以及 Ear/lib 中。现在,在服务器启动时出现上述错误。

现在,如果我将我的 jar 重命名为“EService-MSAccessDB.jar”,错误就会消失。

我觉得问题是 JBoss 服务器库已经包含 hsqldb.jar。当我放置我的超级罐子时,它会引起一些冲突。在启动时,它会尝试找到一个方法,即 DatabaseURL.parseURL(Ljava/lang/String;ZZ)Lorg/hsqldb/persist/HsqlProperties;它存在于我的 uber jar 中,但不在 hsqldb.jar 中。当我重命名我的 uber jar 使其相对于 hsqldb.jar 按字母顺序排列时,问题就消失了。

现在,我的问题是,为什么要在配置 DefaultDS 时寻找这样的方法,这是 JBoss 的默认配置。如何在不将我的 Uber jar 重命名为在我的 Jar 名称前附加“E”的情况下解决此问题是没有意义的。

【问题讨论】:

附带说明 JBoss EAP 4.3 已经有 7 年没有更新了,您可能需要更新到 EAP 的更新版本(如果您不再有支持,您可能需要更新到 Wildfly)来修复您的服务器必须存在的长达一公里的安全漏洞列表... @Aaron 我没有升级 jboss 的选项。我有一个大团队,他们所有人都有这个服务器设置和应用程序。无论如何,这不是生产服务器。它仅用于培训目的。而且我的代码也适用于所有培训服务器。谢谢。 好吧,可能(希望如此?)没有安全问题。我仍然觉得免许可的 Wildfly 10 会比 EAP 4.3 更接近您的产品服务器(假设 EAP 6.2+),因此是更好的培训工具。在此版本中,您缺少许多现代功能,无论是 JavaEE7 还是诸如 Web 控制台或 CLI 工具之类的开发工具。当然只有你知道更新的可行性。请放心,这不是对您的问题的批评,我不会仅仅因为我没有所需的知识而回答它。 感谢亚伦的关心。我们的生产服务器在 WAS 8 上。我真的没有任何权力做出改变服务器的决定。此 jboss 版本仅用于培训和演示目的,以向客户展示应用程序。谢谢。 【参考方案1】:

此 JBoss 服务器包含 hsqldb.jar 版本 1.8.0.x 的副本,供其内部使用。您可以将其替换为 hsqldb-2.3.1.jar 的副本(重命名为原始 jar 的名称)以避免冲突。

【讨论】:

这不会导致内部使用问题吗?正如我所看到的,两个 jar 版本有很大的不同。另外,关于为什么它指的是我的罐子而不是现有罐子的功能有什么想法吗?感谢您的回复。 HSQLDB 2.3.0 版已通过 JBoss 3.2.7 成功测试。 AFAIK 在下一个版本中没有重大变化。该用法适用于不应出现在测试服务器中的 JBoss MQ。您可能需要删除 JBoss 数据目录中的 localDB.xxx 文件。

以上是关于绑定默认 hsql 数据源时启动 Jboss 4.3 时出错的主要内容,如果未能解决你的问题,请参考以下文章

从单元测试连接时,HSQL 立即关闭连接

如何从 Maven 启动和停止 JBoss 服务器,绑定到与 localhost 不同的地址?

windows下JBOSS 7.1 安装部署

通过 jndi 配置数据源时启动 jboss 服务器时出错

无法启动hsql数据库

如何使用外部IP NAT启动JBoss AS