2013-02-19 11 views
7

Ich arbeite an JUnit-Testdatei, die SQL-Datei lädt und lädt sie in Oracle:Kann nicht Klasse instanziiert: 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()); 
     } 

    } 
} 

Wenn ich die Datei testen bekomme ich dieses Problem :

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

können Sie mir sagen, wie ich dieses Problem lösen kann? Und findest du irgendein Problem in diesem Java-Code?

+2

Höchstwahrscheinlich wird der Klassenname muss ein großes "J": 'org.apache.naming.java.JavaURLContextFactory' – iamnotmaynard

+1

Ich änderte die Brief aber ich bekomme wieder die gleiche Fehlermeldung. –

+3

Der Klassenname *** beginnt mit einem Kleinbuchstaben (Schande für diese Apache-Mitwirkenden). Nehmen Sie die erforderlichen JARs in Ihren Klassenpfad auf? – Perception

Antwort

10

Ich habe das behoben, indem ich Bibliotheken von Apache Tomcat zu den Runtime-Testbibliotheken hinzugefügt habe.

In Netbeans:

Project Properties -> Libraries -> Run Tests 

Add JAR/Folder 

Die beiden Bibliotheken, die ich brauchte waren catalina.jar und tomcat-juli.jar. Ihr Kilometerstand kann variieren.

Ich fand sie unter dem Installationsverzeichnis für Tomcat. z:

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

Hinweis eines der Gläser in den bin Verzeichnis ist, das andere im lib Verzeichnis

Dies ist wahrscheinlich nicht der beste Weg, um Ihr Problem zu beheben. Es wäre besser, einen anderen Weg zu haben, die DataSource zu injizieren.

7

Ich erhielt diesen Fehler, da das Jar mit dieser Klasse nicht zu meinem Klassenpfad hinzugefügt wurde. Ausnahme war

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 

Sie müssen die JAR-Datei catalina hinzufügen. Fügen Sie dazu in Ihren Maven-Abhängigkeiten Folgendes hinzu:

Hinweis: Der Artefaktname hat sich jetzt geändert. Artifact Name ist tomcat-catalina statt 'catalina'

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

. So verwenden neueste Version von

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

als

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

Verwandte Themen