Search code examples
javasqlitesql2o

sql2o with SQLite in Java NoInitialContextException


I've got the following code snippet so far:

Sql2o sql2o = new Sql2o("jdbc:sqlite:test.db");

try (Connection connection = sql2o.open()) {
    for (Column column : connection.createQuery("SELECT * FROM sometable").executeAndFetchTable().columns())
        System.out.println(column.toString());
}

I'm using these dependencies:

<dependency>
    <groupId>org.sql2o</groupId>
    <artifactId>sql2o</artifactId>
    <version>1.5.4</version>
</dependency>
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.15.1</version>
</dependency>

However, this throws a NoInitialContextException when executing. Stack trace:

Exception in thread "main" java.lang.RuntimeException: 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 org.sql2o.JndiDataSource.getJndiDatasource(JndiDataSource.java:27)
        at org.sql2o.Sql2o.<init>(Sql2o.java:36)
        at me.mypackage.sqlitetest.SqliteTest.main(SqliteTest.java:11)
Caused by: 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(Unknown Source)
        at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.lookup(Unknown Source)
        at org.sql2o.JndiDataSource.getJndiDatasource(JndiDataSource.java:24)
        ... 2 more

How can I resolve this problem?


Solution

  • Try replacing this line

    Sql2o sql2o = new Sql2o("jdbc:sqlite:test.db");
    

    with

    Sql2o sql2o = new Sql2o("jdbc:sqlite:test.db", null, null);
    

    The Sql2o class has a constructor which takes only a single string, however that single string is a JNDI name, not a JDBC connection URL. There is another constructor that takes three strings, for the connection URL, username and password. SQLite doesn't use the username and password, so we can specify null values for them both.