2013-02-19 24 views
7

Tôi đang làm việc trong hồ sơ kiểm tra Junit mà tải tập tin SQL và tải nó vào Oracle:Không thể nhanh chóng lớp: org.apache.naming.java.javaURLContextFactory

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.length; i++) 
      { 
       // we ensure that there is no spaces before or after the request string 
       // in order to not execute empty statements 
       if (!inst[i].trim().equals("")) 
       { 
        st.executeUpdate(inst[i]); 
        System.out.println(">>" + 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()); 
     } 

    } 
} 

Khi tôi kiểm tra các tập tin tôi nhận được vấn đề này :

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

Bạn có thể cho tôi biết cách khắc phục sự cố này không? Và bạn có tìm thấy bất kỳ vấn đề nào trong mã Java này không?

+2

Nhiều khả năng tên lớp cần có một vốn "J": 'org.apache.naming.java.JavaURLContextFactory' – iamnotmaynard

+1

Tôi đã thay đổi nhưng tôi lại nhận được thông báo lỗi tương tự. –

+3

Tên lớp *** không *** bắt đầu bằng chữ thường (đáng xấu hổ đối với những người đóng góp Apache). Bạn có bao gồm các JAR cần thiết trong classpath của bạn? – Perception

Trả lời

10

Tôi đã sửa lỗi này bằng cách thêm thư viện từ Apache Tomcat vào Thư viện kiểm tra thời gian chạy.

Trong Netbeans:

Project Properties -> Libraries -> Run Tests 

Add JAR/Folder 

Hai thư viện tôi cần là catalina.jartomcat-juli.jar. Số dặm bạn có thể thay đổi.

Tôi tìm thấy chúng trong thư mục cài đặt cho Tomcat. ví dụ:

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

Lưu ý một trong những lọ là trong thư mục bin, người kia trong lib thư mục

Điều này có lẽ không phải là cách tốt nhất để khắc phục vấn đề của bạn. Sẽ tốt hơn nếu bạn có cách khác để tiêm DataSource.

7

Tôi nhận được lỗi này vì bình chứa lớp này không được thêm vào đường dẫn lớp của tôi. Ngoại lệ là

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.<init>(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 

Bạn cần thêm tệp jar catalina. Để thêm điều sau vào phụ thuộc Maven của bạn -

<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>catalina</artifactId> 
    <version>6.0.43</version> 
</dependency> 

Tên hiện vật đã thay đổi bây giờ. Tên tác phẩm là tomcat-catalina thay vì 'catalina'

<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>tomcat-catalina</artifactId> 
    <version>8.0.15</version> 
</dependency> 

. Vì vậy, sử dụng phiên bản mới nhất từ ​​

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

hơn

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

Các vấn đề liên quan