微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在没有外部变量的情况下让嵌入式 Derby 数据库在 IntelliJ IDEA社区版Gradle 项目中工作

如何解决如何在没有外部变量的情况下让嵌入式 Derby 数据库在 IntelliJ IDEA社区版Gradle 项目中工作

简而言之,我正在尝试制作一个桌面 Java 应用程序,用户可以在其中查看家具店的数据,而管理员可以操作该数据。我不得不为自己找到一个数据库解决方案来处理数据。通过一些谷歌搜索,我遇到了 Apache Derby。我使用的 IDE 是 IntelliJ IDEA 2021.1.1(社区版),我的项目是 Gradle 类型的。我主要遵循 this 教程来设置 Derby 以在嵌入式模式下运行。我的主要问题是我无法加载驱动程序,这很可能是由类路径问题引起的。

现在进行更长的解释。我在这里尝试实现的最终目标是我在上面简要描述的应用程序。此应用程序的要求之一是能够以 jar 文件或 zip 文件的形式共享它,其中包含 jar 和其他所需资源。在这两种情况下,用户都应该能够从图形 UI 中打开 jar,除了在他们的计算机上安装 Java 之外,无需事先进行任何配置。

我开始寻找使用 IntelliJ IDEA(社区版)IDE 将本地数据库导入 Java 应用程序的方法。起初我偶然发现了一个名为 Database Navigator插件。找到 Database Navigator 后,我继续寻找要使用的数据库。我以前在学校项目中使用过 Java DB,在该项目中我使用 Netbeans 作为我选择的 IDE。我很快就找到了 Derby,它似乎是我问题的一个很好的解决方案。它甚至似乎不需要使用 Database Navigator 插件。德比被描述为能够做我想要的一切。基本上它似乎是一个不错的选择,因为它是一个 Java DB 数据库,可以设置为在嵌入式模式下工作,而无需设置任何外部变量,也无需在启动 jar 文件时从命令行传递参数。

接下来我开始实际研究如何使用 Derby。我首先快速浏览了前面提到的教程。我几乎立即转向 Apache's own Derby site,因为我正在看的教程谈到了 Netbeans,我并不真正关心它。从 Apache 的 Derby 站点,我继续查看他们的 quick start 指南,然后再查看他们的 getting started 指南。这对我来说并不是很有效,因为我很难将指南中的知识应用到我想要的用例中。结合该指南,我尝试在谷歌上搜索几乎所有没有在我脑海中响起的单词。我花了大约三个小时这样做,直到我决定休息一下。

第二天我又回到原来的tutorial,仔细看了看。基本上,它向您展示了如何在程序中使用数据库,以及如何使用清单文件指向 derby.jar 文件的位置,该文​​件显然具有使用嵌入到应用程序中的 Derby 所需的一切。在完成该教程并遵循它对代码的轻微偏差后,我认为我得到了一些应该可以工作的东西。

下面是我的 DatabaseHelper 类的构造函数,它应该加载数据库的驱动程序。我偏离了教程,将驱动程序名称直接硬编码到 Class.forName() 参数中,而不是从 .properties 文件获取它。这种偏差主要是因为我不熟悉这些文件,大概硬编码的 String 应该可以正常工作。

public DatabaseHelper() {
        String dbDir = System.getProperty("user.dir") + "/.storelist";
        System.setProperty("derby.system.home",dbDir);
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        } catch (ClassNotFoundException e) {
            e.printstacktrace();
        }
    }

当我尝试运行上述代码时,它会在 Class.forName("driverName") 部分捕获 ClassnotFoundException。稍后尝试使用无法加载的驱动程序时,它还会捕获 sqlException。在谷歌搜索这些错误时,普遍的判断似乎是它是一个类路径问题。有了这些信息,如果其他人遇到类似的类路径问题,我会在谷歌上搜索,当然有些人也遇到了同样的问题。显然,这可能是 IntelliJ IDEA 中的一个错误,我发现的一个可能的解决方案是 Classpath fixer。唯一的问题是我很难弄清楚如何使用它。它的自述文件指示在启动程序时在参数中发送一些 iml 和类路径文件的目录。我不熟悉类路径和 iml 文件,谷歌搜索任何一个都没有让我真正到任何地方。

这就是我现在所处的位置。我在这里看到了 similar 个问题,但这些问题与我遇到的问题并不完全相同。我在一个程序中加载嵌入式 Derby 驱动程序时遇到问题,目标是将应用程序放在一个 jar 文件中,该文件可以从 GUI 打开而无需额外的麻烦。如果您知道我这里的方法可能有什么问题,或者您知道将 Derby 引入我的程序的其他方法,我很乐意尝试任何可能的解决方案。

下面是我将清单文件放置在与我的源代码相关的位置的屏幕截图。 manifest location in relation to my source code

以下将在信息中进行额外编辑:

我使用的 derby 的确切版本是 10.15.2.0。我正在运行与 IntelliJ IDEA 捆绑在一起的 JRE 11.0.10.9-1341.41-dcevm。 作为旁注,我的电脑上还安装了 JDK 16.1.0。

这是完整的错误消息输出

java.lang.classNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
    at java.base/java.lang.classLoader.loadClass(ClassLoader.java:519)
    at java.base/java.lang.class.forName0(Native Method)
    at java.base/java.lang.class.forName(Class.java:375)
    at DatabaseHelper.<init>(DatabaseHelper.java:12)
    at FurnitureArchiveMain.main(FurnitureArchiveMain.java:3)
java.sql.sqlException: No suitable driver found for jdbc:derby:DefaultStoreList;create=true
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251)
    at DatabaseHelper.createDB(DatabaseHelper.java:22)
    at FurnitureArchiveMain.main(FurnitureArchiveMain.java:4)
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.sql.Connection.createStatement()" because "dbConnection" is null
    at DatabaseHelper.createDB(DatabaseHelper.java:36)
    at FurnitureArchiveMain.main(FurnitureArchiveMain.java:4)

我的类路径中唯一的 Derby jar 是 derby.jar

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。