【问题标题】:TomEE deploy failed datasource not found未找到 TomEE 部署失败的数据源
【发布时间】:2026-02-07 15:30:02
【问题描述】:

我想将战争文件部署到 TomEE,但失败:

原因:

javax.naming.NameNotFoundException: 
      Name openejb/Resource/application_name/mysql_ds" not found.

如果我重新启动服务器,部署正常但只有一次,然后遇到同样的错误。

我在 WEB-INF/resources.xml 文件中定义了数据源

<tomee>
    <Resource id="mysql_ds" type="javax.sql.DataSource">
        JdbcDriver  = com.mysql.jdbc.Driver
        JdbcUrl     = jdbc:mysql://IP:3306/db?serverTimezone=UTC&amp;autoReconnect=true
        UserName    = user
        Password    = password
        JtaManaged  = true
    </Resource>
</tomee>

另外我应该提一下,还有另一个具有相同配置的克隆应用程序(开发模式),它工作正常。

【问题讨论】:

    标签: java datasource web-deployment apache-tomee openejb


    【解决方案1】:

    您可以使用WEB-INF/resources.xml 定义一个或多个数据源,也可以使用&lt;tomee-home&gt;/conf 文件夹中的tomee.xml 文件,如TomEE 项目文档的corresponding section 中所述:

    可以通过 /conf/tomee.xml 文件或 WEB-INF/resources.xml 文件中的 xml 声明数据源

    但是,resources.xml 的语法与容器范围的定义略有不同。对于与您的 Web 应用程序捆绑在一起的 resources.xml,它应该如下公式化:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <Resource id="mysql_ds" type="javax.sql.DataSource">
            JdbcDriver  = com.mysql.jdbc.Driver
            JdbcUrl     = jdbc:mysql://IP:3306/db?serverTimezone=UTC&amp;autoReconnect=true
            UserName    = user
            Password    = password
            JtaManaged  = true
        </Resource>
    </resources>
    

    请注意,标签&lt;resources&gt; 与您问题中给出的&lt;tomee&gt; 不同。这应该适用于默认的 TomEE 环境。另见:rmannibucau 的评论。

    希望,它会有所帮助。

    【讨论】:

    • 请注意,如果发现有冲突的定义,资源将根据上下文(使用类加载器)进行解析,因此您仍然可以在 2 个不同的 Web 应用中部署 2 个冲突资源。
    • @rmannibucau 对于这种情况,这是一个很好的提示/澄清,谢谢。