Java Tomcat 5.5没有';启动时无法识别数据源(空组件Catalina:type=DataSource)
我已经在本地电脑上安装了Postgres 9.0.1 SQL server和Tomcat 5.5.28,运行良好。但是我无法配置Tomcat,使数据源通过JNDI可用。我想我已经从Tomcat页面一直遵循JNDI操作指南(也尝试了其他页面的其他操作指南)。但每次Tomcat启动时,他都会显示错误消息:Java Tomcat 5.5没有';启动时无法识别数据源(空组件Catalina:type=DataSource),java,eclipse,tomcat,datasource,jndi,Java,Eclipse,Tomcat,Datasource,Jndi,我已经在本地电脑上安装了Postgres 9.0.1 SQL server和Tomcat 5.5.28,运行良好。但是我无法配置Tomcat,使数据源通过JNDI可用。我想我已经从Tomcat页面一直遵循JNDI操作指南(也尝试了其他页面的其他操作指南)。但每次Tomcat启动时,他都会显示错误消息: SEVERE: Null component Catalina:type=DataSource,path=/MyApp,host=localhost,class=javax.sql.DataSou
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软件基金会\Tomcat 5.5\common\lib
I:\Apache软件基金会\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>
…
对工厂的Postgres资源引用
jdbc/postgres
javax.sql.DataSource
容器
Eclipse将我的项目部署为WAR,Tomcat在启动时将WAR分解为文件夹。现在奇怪的事情是:如果我不是用手启动Tomcat,而是用Eclipse启动,那么一切都正常!!!Tomcat没有出现上面的错误消息。
我发现Eclipse在启动Tomcat时使用了自己的server.xml、context.xml等,但即使将这些文件与Tomcat的常规配置文件进行了比较,到目前为止,我发现的唯一区别是Eclipse的server.xml中在关闭“host”标记之前增加了以下行:
但是,即使我将这一行复制到Tomcat自己的server.xml中(没有“source”属性),没有Eclipse它也无法工作。因此,Eclipse必须做一些“额外的”工作,使查找数据源成为可能,而“正常的”Tomcat配置失败。因为我必须在不同的服务器上部署WAR(没有Eclipse),所以我需要帮助在没有Eclipse的情况下运行WAR。我认为我的代码还可以,因为它可以与Eclipse的Tomcat配合使用,但我对Tomcat5.5的配置肯定有问题。有什么想法吗?在这个问题上花了几个小时之后,我找到了一种避免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查找的步骤:
我没有改变特定于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
元素不应该设置path
或docBase
,因为它们是在web应用程序级别定义时推断出来的。提到
Cannot create JDBC driver of class '' for connect URL 'null'