Java JNDI需要JDK吗?

Java JNDI需要JDK吗?,java,tomcat,jndi,Java,Tomcat,Jndi,我尝试从SUSE Linux Enterprise Server为Tomcat6配置Oracle datesource。我将datasource添加到context.xml文件: <Resource name="jdbc/UCPPool" auth="Container" factory="oracle.ucp.jdbc.PoolDataSourceImpl" type="oracle.ucp.jdbc.PoolDataSource" descript

我尝试从SUSE Linux Enterprise Server为Tomcat6配置Oracle datesource。我将datasource添加到context.xml文件:

   <Resource 
   name="jdbc/UCPPool"
   auth="Container"
   factory="oracle.ucp.jdbc.PoolDataSourceImpl"
   type="oracle.ucp.jdbc.PoolDataSource"
   description="Pas testing UCP Pool in Tomcat"
   connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource"
   minPoolSize="2"
   maxPoolSize="5"
   inactiveConnectionTimeout="20"
   user="scott"
   password="tiger"
   url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)
        (HOST=beast.au.oracle.com)(PORT=1523))(CONNECT_DATA=
        (SERVICE_NAME=linux11gr2)))"
   connectionPoolName="UCPPool"
   validateConnectionOnBorrow="true"
   sqlForValidateConnection="select 1 from DUAL" />

在我的persistence.xml应用程序中,添加非jta数据源属性。但每次我想启动应用程序时,tomcat都会抛出以下异常:

   Caused by: org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/jdbc/nameDB]
         at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:68)
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:78)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:920)
    ... 28 more
   Caused by: javax.naming.NamingException: This context must be accessed throught a java: URL
   org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:65)
原因:org.hibernate.service.jndi.JndiException:无法查找jndi名称[java:comp/env/jdbc/nameDB]
位于org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:68)
位于org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
位于org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
位于org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
位于org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
位于org.hibernate.engine.jdbc.internal.jdbcservicesiml.buildJdbcConnectionAccess(jdbcservicesiml.java:223)
位于org.hibernate.engine.jdbc.internal.jdbcservicesiml.configure(jdbcservicesiml.java:89)
位于org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
位于org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
位于org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
在org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:78)上
位于org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283)
位于org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279)
位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748)
位于org.hibernate.ejb.EntityManagerFactoryImpl。(EntityManagerFactoryImpl.java:94)
位于org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:920)
... 28多
原因:javax.naming.NamingException:必须通过java:URL访问此上下文
org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:65)
我在OpenSuse上尝试了相同的配置,它在那里工作。我发现的唯一区别是SLSE已经从IBM安装了JavaSE,而openSUSE使用OpenJDKJava作为定义


所以JNDI需要JDK,或者它是IBM java实现中的一些错误?

回答标题中的问题,不,JNDI是JRE的一部分。不需要JDK。

在您的资源定义中,名称是
jdbc/UCPPool
,但当您查找它时,您将使用
jdbc/nameDB
。这不正确吗?我只是在从stacktrace复制时忘了更改。但每次我都用同一个名字谢谢你的回复。你知道为什么这不起作用吗?