linkD linkD - 7 days ago 5
Java Question

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?

Answer

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.

Comments