【问题标题】:No suitable driver found for jdbc:sqlite:找不到适合 jdbc:sqlite 的驱动程序:
【发布时间】:2017-11-12 11:15:21
【问题描述】:

我很痛苦地意识到关于这个主题的帖子的数量,但到目前为止,浏览它们并没有帮助我。

我有一个使用 sqlite3 数据库的 maven 项目。这从 intelliJ 中成功运行。但我想通过运行以下命令来检查它是否也能够作为 jar 运行:

    Bradleys-MBP:general-state-machine atkinsb$ java -cp target/general-state-machine-1.0-SNAPSHOT.jar com.bradley.atkins.state.GeneralStateMachine
No suitable driver found for jdbc:sqlite:/Users/atkinsb/.general_state_machine/default/20171112105601/database/sm.db
Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at com.bradley.atkins.state.StateMachineDb.executeSqlStatement(StateMachineDb.java:82)
        at com.bradley.atkins.state.StateMachineDb.createTables(StateMachineDb.java:33)
        at com.bradley.atkins.state.StateMachineInit.prepareDatabase(StateMachineInit.java:54)
        at com.bradley.atkins.state.StateMachineInit.prepare(StateMachineInit.java:12)
        at com.bradley.atkins.state.GeneralStateMachine.main(GeneralStateMachine.java:12)

我对 Java 相当缺乏经验,并且正在努力理解为什么会失败。谷歌搜索时可能出现的答案是:

  • 我需要以某种方式将 sqlite3 jar 本身包含到我的项目中。也许让它成为一个“胖罐子”而不是依赖 maven 将其作为依赖项引入?
  • 我需要将 sqlite3 jar 添加到我在 intelliJ 中的类路径中。我不知道如何明确设置这个...
  • 从如下代码显式加载 jar:

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

就在建立连接之前...

  • 我想直接从命令行运行jar,需要设置sqlite3的路径吗?

我对依赖项的 maven 设置是:

  <dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.20.1</version>
  </dependency>

虽然我的方法看起来像:

public static void executeSqlStatement(String sql) 抛出 ClassNotFoundException {

Connection conn = null;

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

try {
  conn = DriverManager.getConnection(url);
  Statement stmt = conn.createStatement();
  stmt.execute(sql);
} catch (SQLException e) {
  System.out.println(e.getMessage());
} finally {
  try {
    if (conn != null) {
      conn.close();
    }
  } catch (SQLException ex) {
    System.out.println(ex.getMessage());
  }
}

}

就像我说的,这一切在 IntelliJ 中都可以正常工作,但我要确认它会以正确的方式作为独立 jar 工作吗?我希望最终将这个项目编译为一个 jar,其他项目可以作为导入导入。

任何关于如何确保我能达到这一点的建议将不胜感激。

谢谢

布拉德利

【问题讨论】:

    标签: java maven intellij-idea sqlite classpath


    【解决方案1】:

    类路径中缺少您的类(但您显然已经知道)。问题是由您如何处理 JAR 的打包以及您如何尝试运行您的应用程序引起的。

    当您从 InteliJ(或大多数具有 Maven 集成的 IDE)运行程序时,它会自动在类路径中包含 Maven 定义的所有必需的 JAR 和依赖项,并且一切正常。但是,当您使用命令行(例如java -cp ...)运行您的应用程序时,Maven 依赖项不会附加到您的类路径中,除非您特别添加它们。由于您的类似乎也没有打包在您的 JAR 中,因此当您运行应用程序时,它不在您的类路径中。

    如果您要使用命令行运行程序以准确重现它在 IntelliJ 中的运行方式,那么这将是一个非常长的命令,其中包含您的 target/classes 目录和 所有依赖项 cp 选项,例如

    java -cp C:/myproject/target/classes/;C:/somewhere/.m2/repository/org/xerial/sqlite-jdbc/3.20.1/sqlite-jdbc-3.20.1/sqlite-jdbc-3.20.1.jar; ... [lots of dependencies] ... ;C:/somewhere/.m2/repository/org/somepackage/someartifact.jar
    

    我需要以某种方式将 sqlite3 jar 本身包含到我的项目中。 也许把它变成一个“胖罐子”

    我认为这是正确的方法,但有一点细微差别。如果您希望使用 java 命令将 JAR 作为独​​立应用程序运行,您可能需要创建一个 executable jar。看看Maven Shade PluginMaven Assembly Plugin。用谷歌搜索一下会告诉你如何使用依赖项创建 JAR。

    我希望最终将此项目编译为其他项目的 jar 可以作为导入拉入。

    如果您希望其他项目将您的项目作为依赖项引入您的项目使用 Maven,您可能不想让您的 JAR 可执行文件或“胖 jar”。 (可能会导致类重叠等各种问题)例如,如果您的 JAR 应该是其他项目的库或助手,您可以将您的应用程序部署在 Maven 存储库上,并使用相同的 &lt;dependency&gt; 机制在其他项目中引用它.

    当你定义一个依赖时,Maven 也会拉取任何transitive dependencies(dependencies-of-dependencies)。尝试运行 mvn dependency:tree -Dverbose 以查看当前应用使用的所有依赖项。

    我不知道你对 Maven 的熟悉程度,如果需要任何精确的评论,我会相应地编辑我的答案;)

    【讨论】:

    • 非常感谢,皮埃尔。这很有帮助。是的,我在 maven 方面的经验有限,在过去的几个月里,我一直在从事一个 maven 项目,并且学到了很多东西,但没有以前的经验。你已经为我澄清了很多,让我思考我想如何部署它。再次感谢! :)
    • 很高兴为您提供帮助!如果此答案对您有所帮助,请随意投票和/或接受它;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2016-04-02
    • 2019-03-08
    • 2013-03-16
    相关资源
    最近更新 更多