10

SQLファイルをロードしてOracleにロードするJUnitテストファイルに取り組んでいます。

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());
        }

    }
}

ファイルをテストすると、次の問題が発生します。

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

この問題を解決する方法を教えてください。また、このJavaコードに問題がありますか?

4

2 に答える 2

7

このクラスを持つ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.<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

catalinajar ファイルを追加する必要があります。そのためには、Maven の依存関係に以下を追加します -

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

アーティファクト名が変更されたことに注意してください。アーティファクト名はtomcat-catalina「カタリナ」ではなく

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

. そのため、最新バージョンを使用してください

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

よりも

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

于 2014-11-30T10:00:14.387 に答える