我已在本地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配置必定是错误的。有什么想法吗?
答案 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查找的步骤:
修改标签“GlobalNamingResources”中%CATALINA_HOME%/ conf / server.xml中的server.xml文件:这里我添加了已在我的context.xml中的完整“资源”标记部分(参见上文) )。
修改“Context”标签内%CATALINA_HOME%/ conf / context.xml中的context.xml文件:我在这里添加了一行:<ResourceLink global="jdbc/postgres" name="jdbc/postgres" type="javax.sql.DataSource"/>
我保持webapp特定的web.xml和context.xml不变(如上所示)。现在一切正常。我发布了我的问题的解决方案,我发现自己希望有类似问题的其他人可能会受益。