0

I have the following structure:

BUILD.bazel
MODULE.bazel
com/test/TestMain.java
com/test/assets/

BUILD.bazel

load("@rules_java//java:defs.bzl", "java_binary")

package(default_visibility = ["//visibility:public"])

java_binary(
    name = "TestMain",
    srcs = glob(["com/test/TestMain.java"]),
    main_class = "com.test.TestMain",
    resources = glob(["com/test/assets/*"])
)

MODULE.bazel

bazel_dep(name = "rules_java", version = "7.11.1")

bazel_dep(name = "sqlite3", version = "3.47.2")

com/test/TestMain.java

import java.io.IOException;
import java.sql.*;

public class TestMain {

    public static void main(String args[]) throws IOException {

        try {
            Connection connection = DriverManager.getConnection("jdbc:sqlite:com/test/assets/sample.db");
            Statement statement = connection.createStatement();

            statement.setQueryTimeout(30);
            statement.executeUpdate("drop table if exists blog_post");
            statement.executeUpdate("create table blog_post(id integer, title string, content string)");
            statement.executeUpdate("insert into blog_post(1, 'test','ldsjkfslkdfjl')");
            statement.executeUpdate("insert into blog_post(2, 'testdd','ldsjkfslkdfjl')");
            ResultSet rs = statement.executeQuery("select * from blog_post");
            while(rs.next()) {
                System.out.println("title = " + rs.getString("title"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Which gives me

java.sql.SQLException: No suitable driver found for jdbc:sqlite:com/test/assets/sample.db
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251)

Any ideas how I can get the driver to work?

At first I thought to add deps to the binary but I'm not sure how; I tried;

deps = ["sqlite3"]

which gives me

in deps attribute of java_binary rule //:TestMain: target '//:sqlite3' does not exist.

Changing the deps to

deps = ["@sqlite3"]

builds but the same no suitable driver error appears.

I tried adding a repo name to the bazel_dep

bazel_dep(name = "sqlite3", version = "3.47.2",
repo_name = "com_github_xerial_sqlite_jdbc")

and having it match the deps;

    deps = ["@com_github_xerial_sqlite_jdbc//:sqlite3"]

As seen in the bazelbuild examples;

with the same issues.

1 Answer 1

1

you need to add the jar classpath, it has all the classes that are needed to access sqlite. JDBC is one of the most common ones, here’s an example of initiating with it:

    Class.forName("org.sqlite.JDBC");

in case you need to download it here’s the github

Sign up to request clarification or add additional context in comments.

3 Comments

How do I add the jar classpath within Bazel? I assumed specifying it as a dependency and having the module file declare it as something to download would take care of that.
And I can confirm adding the line to the main file returns "java.lang.ClassNotFoundException: org.sqlite.JDBC"
i think you’re looking for java_import: bazel.build/reference/be/java#java_import

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.