You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moqui框架启动时PostgreSQL事务数据源连接报错问题

Moqui框架启动连接PostgreSQL数据源失败问题处理

问题复现操作

执行以下命令启动Moqui框架时触发报错:

$ git clone https://github.com/moqui/moqui-framework.git moqui
$ cd moqui
$ ./gradlew getComponent -Pcomponent=PopCommerce
$ ./gradlew getComponent -Pcomponent=HiveMind
$ ./gradlew downloadElasticSearch
$ ./gradlew load

报错信息

启动时重试5次连接transactional数据源均失败,核心报错日志如下:

20:33:03.043 ERROR main .moqui.i.e.EntityDatasourceFactoryImpl Error connecting to DataSource transactional (postgres), try 4 of 5: java.lang.ExceptionInInitializerError: Exception bitronix.tm.internal.BitronixRuntimeException: error initializing JdbcProxyFactory [in thread "main"]

20:32:52.683  WARN c-jmx-worker b.tm.u.ManagementRegistrar Cannot execute ManagementRegisterCommand on object with name bitronix.tm:type=JDBC,UniqueName=transactional_DS,Id=4

20:32:36.567 ERROR  main .moqui.i.e.EntityDatasourceFactoryImpl Error connecting to DataSource transactional (postgres), try 1 of 5: java.lang.reflect.InaccessibleObjectException: 
Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @56620197

现有配置说明

当前MoquiDefaultConf.xml中基础属性配置:

<default-property name="instance_purpose" value="production"/>

<!-- Locale and Time Zone Properties -->
<default-property name="default_locale" value="en_US"/>
<default-property name="default_time_zone" value="US/Pacific"/>
<default-property name="database_time_zone" value="US/Pacific"/>

<!-- Web App Properties -->
<default-property name="webapp_http_host" value=""/>
<default-property name="webapp_http_port" value=""/>
<default-property name="webapp_https_port" value=""/>
<default-property name="webapp_https_enabled" value="false"/>
<default-property name="webapp_allow_origins" value=""/>
<default-property name="webapp_handle_cors" value="true"/>
<default-property name="webapp_status_ips" value="127.0.0.1"/>
<default-property name="webapp_require_session_token" value="true"/>
<default-property name="webapp_upload_executable_allow" value="false"/>
<default-property name="webapp_client_ip_header" value=""/>

<!-- Properties for the primary (transactional group) datasource -->
<default-property name="entity_ds_db_conf" value="postgres"/>
<default-property name="entity_ds_host" value="127.0.0.1"/>
<default-property name="entity_ds_port" value="5432"/>
<default-property name="entity_ds_database" value="h2"/>
<default-property name="entity_ds_url" value="jdbc:h2:${moqui_runtime}/db/h2/${entity_ds_database};lock_timeout=30000"/>
<default-property name="entity_ds_schema" value=""/>
<default-property name="entity_ds_user" value="postgres"/>
<default-property name="entity_ds_password" value="trunghung0804"/>
<default-property name="entity_ds_crypt_pass" value="MoquiDefaultPassword:CHANGEME"/>
<default-property name="entity_ds_crypt_pass_old" value="MoquiDefaultPassword:CHANGEME"/>
<default-property name="entity_add_missing_runtime" value="false"/>
<default-property name="entity_add_missing_startup" value="true"/>
<default-property name="entity_lock_track" value="false"/>
<default-property name="entity_statement_timeout" value="false"/>
<default-property name="entity_empty_db_load" value="seed,seed-initial,install"/>

数据源配置段如下:

<datasource group-name="transactional" database-conf-name="${entity_ds_db_conf}" schema-name="${entity_ds_schema}"
        runtime-add-missing="${entity_add_missing_runtime}" startup-add-missing="${entity_add_missing_startup}">
    <!-- by default no inline-jdbc or jndi-jdbc elements, use default from database conf -->
</datasource>
<datasource group-name="transactional" database-conf-name="postgres" schema-name="">
    <inline-jdbc pool-minsize="5" pool-maxsize="50">
        <xa-properties user="postgres" password="trunghung0804" pinGlobalTxToPhysicalConnection="true"
                       serverName="127.0.0.1" port="5432" databaseName="moqui" autoReconnectForPools="true"
                       useUnicode="true" encoding="UTF-8"/>
    </inline-jdbc>
</datasource>

数据库连接配置参考截图


解决步骤

按以下顺序排查修复即可:

  • 修复JDK版本兼容问题
    日志中的InaccessibleObjectException是高版本JDK模块权限限制导致的:Moqui依赖的Bitronix事务管理器需要反射访问JDK核心类,JDK 16及以上版本默认禁止未命名模块访问java.lang包核心方法,直接导致JdbcProxyFactory初始化失败。
    • 优先方案:切换本地JDK版本为JDK 11(Moqui官方长期兼容的LTS版本),重新执行启动命令即可。
    • 临时兼容方案:如果必须使用JDK17+,修改Gradle启动参数,在moqui-framework/gradle/run.gradle的JVM启动参数里追加以下模块开放参数:
      --add-opens java.base/java.lang=ALL-UNNAMED
      --add-opens java.base/java.util=ALL-UNNAMED
      --add-opens java.base/java.lang.reflect=ALL-UNNAMED
      
  • 清理配置冲突
    当前配置重复定义了两次transactional组的数据源,同时属性段残留H2数据库连接参数,会导致配置加载优先级混乱:
    • 删除第一个无inline-jdbc配置的transactional数据源定义,只保留写了PostgreSQL连接参数的数据源节点。
    • 删除属性段中H2专用的entity_ds_database、entity_ds_url两个配置项,避免被错误引用。
  • 数据库前置校验
    确认本地PostgreSQL服务正常启动、5432端口可访问,已提前创建名为moqui的数据库,连接所用的postgres账号拥有对应库的读写权限。

所有修改完成后先执行./gradlew clean清空旧构建缓存,再重新执行./gradlew load启动即可。


内容的提问来源于stack exchange,提问作者Đình Hiếu Lê

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:27:22