Tomcat 5.5在启动时无法识别DataSource(Null组件Catalina:type = DataSource)

时间:2010-11-19 20:41:51

标签: java eclipse tomcat datasource jndi

我已在本地PC上设置了Postgres 9.0.1 SQL服务器和Tomcat 5.5.28。两者都运行良好。但我无法配置Tomcat以通过JNDI使DataSource可用。我想我已经跟着JNDI HOW-TO从Tomcat页面到了这封信(以及从其他页面尝试了一些其他的方法)。但每次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

我:\ 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服务器中的以下附加行。关闭“host”标记之前的xml:

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

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

1 个答案:

答案 0 :(得分:2)

在问题上花了更多时间后,我找到了避免Tomcat错误消息的方法。我的Eclipse配置似乎有问题,因为它被配置为将一些Tomcat自己的jar添加到文件夹“I:\ Apache Software Foundation \ Tomcat 5.5 \ webapps \ MyApp \ WEB-INF \ lib”中。在我将Eclipse的设置更改为不包含它们但将这些库用作引用的之后,它们不再包含在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文件:我在这里添加了一行:<ResourceLink global="jdbc/postgres" name="jdbc/postgres" type="javax.sql.DataSource"/>

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