javax.naming.NoInitialContextException错误的解决方案

今天,学习用了一下nutz框架,写了一个HelloWorld的小程序,在用jndi配置数据源时,写了一个测试类,并在main方法中调用了jndi获得数据库连接,但是报错了,错误信息如下:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial。

这是什么问题呢,大体好像说是上下文初化异常!我看了一下我的配置

步骤:   
1. 在tomcat目录下conf/context.xml文件中 加入一下代码 
      <Resource name="jdbc/test" 
      auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="net.sourceforge.jtds.jdbc.Driver" 
      url="jdbc:sqlserver://localhost:1433;databaseName=nutztest" 
      username="sa" 
      password="sa" 
      maxActive="100"   //连接池的最大数据库连接数,设为0表示无限制 
      maxIdle="30"      //最大空闲数,设为0表示无限制 
      maxWait="10000"/> //最大连接等待时间.如果超时将接到异常.设为  -1 表示无限制 

2.将jtds-1.2.5jar包,nutz.jar放到了工程中

3.  写测试类

public class Test{

public Connection getConnection(){ 
try { 
Context ctx = new InitialContext(); 
DataSource ds = (DataSource)ctx.lookup("jdbc/test"); 
conn = ds.getConnection(); 
} catch (NamingException e) { 
e.printStackTrace(); 
} catch (SQLException e) { 
e.printStackTrace(); 

return conn; 


public static void main(String[] args) { 
System.out.println(newTest().getConnection()); 

}

4.运行tomcat-- 运行测试代码,抛出异常: 
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial 
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645) 
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325) 
at javax.naming.InitialContext.lookup(InitialContext.java:392) 

后来看到论坛里的回复才知道原因

在用JNDI连接数据库时用main函数测试时总报错,
InitialContext 是要在应用服务器的上下文里才有的。
你在普通的应用程序里怎么行!
放到tomcat里面运行看看吧!
不能用main函数直接测试,只能放到tomcat或者servlet、jsp显示
原文地址:https://www.cnblogs.com/borter/p/9578158.html