无法实例化类:org.apache.naming.java.javaURLContextFactory

我正在研究Junit测试文件,它加载SQL文件并将其加载到Oracle中:

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import oracle.jdbc.pool.OracleConnectionPoolDataSource; import org.junit.BeforeClass; import org.junit.Test; public class OracleCreateScheme1 { public OracleCreateScheme1() { } @BeforeClass public static void setUpClass() throws Exception { // rcarver - setup the jndi context and the datasource try { // Create initial context System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory"); System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming"); InitialContext ic = new InitialContext(); ic.createSubcontext("java:"); ic.createSubcontext("java:/comp"); ic.createSubcontext("java:/comp/env"); ic.createSubcontext("java:/comp/env/jdbc"); // Construct DataSource OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource(); ds.setURL("jdbc:oracle:thin:@192.168.1.104:1521:oracle"); ds.setUser("admin"); ds.setPassword("qwerty"); ic.bind("java:/comp/env/jdbc/oracle", ds); } catch (NamingException ex) { //Logger.getLogger(MyDAOTest.class.getName()).log(Level.SEVERE, null, ex); } } @Test public void createOracleScheme() throws SQLException, NamingException { Context initContext = new InitialContext(); Context webContext = (Context) initContext.lookup("java:/comp/env"); DataSource ds = (DataSource) webContext.lookup("jdbc/Oracle"); // Read File ------------------------------------------------------------------ String s = new String(); StringBuffer sb = new StringBuffer(); try { FileReader fr = new FileReader(new File("OracleScheme.sql")); BufferedReader br = new BufferedReader(fr); while ((s = br.readLine()) != null) { sb.append(s); } br.close(); // here is our splitter ! We use ";" as a delimiter for each request // then we are sure to have well formed statements String[] inst = sb.toString().split(";"); Connection c = ds.getConnection(); Statement st = c.createStatement(); for (int i = 0; i >" + inst[i]); } } } catch (Exception e) { System.out.println("*** Error : " + e.toString()); System.out.println("*** "); System.out.println("*** Error : "); e.printStackTrace(); System.out.println("################################################"); System.out.println(sb.toString()); } } } 

当我测试文件时,我遇到了这个问题:

Cannot instantiate class: org.apache.naming.java.javaURLContextFactory

你能告诉我如何解决这个问题吗? 你也发现这个Java代码有什么问题吗?

我通过将Apache Tomcat中的库添加到运行时测试库来修复此问题。

在Netbeans中:

 Project Properties -> Libraries -> Run Tests Add JAR/Folder 

我需要的两个库是catalina.jartomcat-juli.jar 。 你的里程可能有所不同

我在Tomcat的安装目录下找到了它们。 例如:

 apache-tomcat-7.0.34/bin/tomcat-juli.jar apache-tomcat-7.0.34/lib/catalina.jar 

注意其中一个jar位于bin目录中,另一个位于lib目录中

这可能不是解决问题的最佳方法。 注入DataSource方法会更好。

我收到此错误,因为具有此类的jar未添加到我的类路径中。 例外是

 Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.naming.java.javaURLContextFactory [Root exception is java.lang.Class NotFoundException: org.apache.naming.java.javaURLContextFactory] at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) at javax.naming.InitialContext.init(InitialContext.java:223) at javax.naming.InitialContext.(InitialContext.java:175) at ContextLoaderTest.setDataSourceInformation(ContextLoaderTest.java:51) at ContextLoaderTest.main(ContextLoaderTest.java:34) Caused by: java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFact ory 

你需要添加catalina jar文件。 为此,在Maven依赖项中添加以下内容 –

  org.apache.tomcat catalina 6.0.43  

注意工件名称现已更改。 工件名称是tomcat-catalina而不是’catalina’

  org.apache.tomcat tomcat-catalina 8.0.15  

。 所以使用最新版本

http://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina

http://mvnrepository.com/artifact/org.apache.tomcat/catalina