【问题标题】:Tomcat 5.5 doesn't recognize DataSource at startup (Null component Catalina:type=DataSource)Tomcat 5.5 在启动时无法识别 DataSource(Null 组件 Catalina:type=DataSource)
【发布时间】:2011-05-12 20:47:52
【问题描述】:

我已经在本地 PC 上设置了 Postgres 9.0.1 SQL 服务器和 Tomcat 5.5.28。两者都运行良好。但我无法配置 Tomcat 以通过 JNDI 使 DataSource 可用。我想我已经从 Tomcat 页面一直遵循 JNDI HOW-TO(以及从其他页面尝试了其他一些操作方法)。但每次 Tomcat 启动时,他都会显示错误消息:

SEVERE: Null component Catalina:type=DataSource,path=/MyApp,host=localhost,class=javax.sql.DataSource,name="jdbc/postgres"

尽管如此,Tomcat 确实启动了,但我的数据库代码无法运行,因为我的 InitialContext.lookup 最终什么都没有。

将postgres驱动“postgresql-8.4-701.jdbc4.jar”复制到以下文件夹中:

I:\Apache Software Foundation\Tomcat 5.5\common\lib

I:\Apache Software Foundation\Tomcat 5.5\webapps\MyApp\WEB-INF\lib

这是我的 MyApp/META-INF/context.xml:

<Context path="/MyApp" docBase="MyApp" crossContext="true" reloadable="true" debug="1">
    <Resource name="jdbc/postgres" 
        auth="Container"
            type="javax.sql.DataSource" 
            username="postgres" 
            password="xxx" 
            driverClassName="org.postgresql.Driver"
            url="jdbc:postgresql://localhost/MyDatabase"
            maxWait="1000"
            maxActive="20" 
            maxIdle="10">
    </Resource>
</Context>

这是我的 MyApp/WEB-INF/web.xml 的摘录:

<web-app>
…
<resource-ref>
    <description>
        Postgres resource reference to a factory
    </description>
    <res-ref-name>
        jdbc/postgres
    </res-ref-name>
    <res-type>
        javax.sql.DataSource
    </res-type>
    <res-auth>
        Container
    </res-auth>
  </resource-ref>
</web-app>

Eclipse 将我的项目部署为 WAR,Tomcat 在启动时将 WAR 作为文件夹展开。现在奇怪的是:如果我不手动启动 Tomcat,而是通过 Eclipse,一切正常!!! Tomcat 没有提供上面的错误信息。 我发现 Eclipse 在启动 Tomcat 本身时使用它自己的 server.xml、context.xml 等,但即使在将这些文件与 Tomcat 的常规配置文件进行比较之后,到目前为止我发现的唯一区别是 Eclipse 服务器中的以下附加行。关闭“主机”标签之前的 xml:

<Context docBase="MyApp" path="/MyApp" reloadable="true" source="org.eclipse.jst.j2ee.server:MyApp"/>

但是,即使我将这一行复制到 Tomcat 自己的 server.xml 中(没有“源”属性),如果没有 Eclipse,它也无法工作。所以 Eclipse 必须做一些“额外的”事情,这使得找到 DataSource 成为可能,而“正常”的 Tomcat 配置失败。因为我必须在不同的服务器上部署 WAR(没有 Eclipse),所以我需要帮助才能在没有 Eclipse 的情况下运行它。我认为我的代码没问题,因为它适用于 Eclipse 的 Tomcat,但我对 Tomcat 5.5 的配置肯定有问题。有什么想法吗?

【问题讨论】:

    标签: java eclipse tomcat datasource jndi


    【解决方案1】:

    在这个问题上花了几个小时后,我找到了一种避免 Tomcat 错误消息的方法。看来我的 Eclipse 配置有问题,因为它被配置为将一些 Tomcat 自己的 jar 添加到文件夹“I:\Apache Software Foundation\Tomcat 5.5\webapps\MyApp\WEB-INF\lib”中。在我将 Eclipse 的设置更改为不包含它们但将这些库用作 referenced 之后,它们不再包含在 WAR 文件中,并且 Tomcat 启动时没有错误。更准确地说,必须删除在我的 webapp 的 lib 中复制的以下三个 jar 以避免该消息:“naming-factory.jar”、“naming-factory-dbcp.jar”和“naming-resources.jar” ”。

    有趣的是,虽然 Tomcat 现在可以正常启动,但结果还是一样:如果从 Eclipse 内部启动,我的 webapp 会通过 JNDI 查找数据源成功,但是当我在不使用 Eclipse 的情况下启动 Tomcat 时,webapp 仍然会失败尝试使用以下错误消息访问数据库时:

    Cannot create JDBC driver of class '' for connect URL 'null'
    

    我也花了一些时间来完成这项工作。我不得不放弃定义应用程序特定数据源的首选方法,而是定义了一个全局数据源。我仍然不知道为什么 Tomcat 拒绝了解我的应用程序特定设置,但至少可以规避这个问题。以下是解决我所有问题并允许我进行 JNDI 查找的步骤:

    1. 在标签“GlobalNamingResources”内修改 %CATALINA_HOME%/conf/server.xml 中的 server.xml 文件:这里我添加了已经在我的 context.xml 中的完整“资源”标签部分(见上文)。

    2. 修改“Context”标签内%CATALINA_HOME%/conf/context.xml中的context.xml文件:这里我加了一行:&lt;ResourceLink global="jdbc/postgres" name="jdbc/postgres" type="javax.sql.DataSource"/&gt;

    我保留了特定于 webapp 的 web.xml 和 context.xml 不变(如上所示)。现在一切正常。我发布了我发现自己的问题的解决方案,希望其他有类似问题的人也能从中受益。

    【讨论】:

    • 再补充一点:Tomcat 7 不会出现“无法创建 JDBC 驱动程序”错误。今天我放了与 Tomcat 5.5 相同的 WAR 文件。在 Tomcat 7 安装中产生此错误。使用 Tomcat 7,我不需要定义全局资源的解决方法 - 似乎只是 Tomcat 5.5 在我定义应用程序特定数据源的方式上存在问题。
    • 在您的MyApp/META-INF/context.xml 中,Context 元素不应设置pathdocBase,因为它们是在Web 应用程序级别定义时推断的。参考Context at Tomcat 5.5
    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 2019-06-23
    • 2021-06-20
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多