java - 当程序从另一个目录运行时 DriverManager.getConnection 不起作用

标签 java linux sqlite

我有一个使用 sqlite 数据库的字典应用程序。当我在终端中运行应用程序时 使用此命令 java -jar RememberDict.jar 存在的 jar 文件的路径它可以工作,但是当我从应用程序所在的位置以外的其他位置运行它时,它会给我错误,我相信它来自此代码:

try {
        conn = DriverManager.getConnection("jdbc:sqlite:" + System.getProperty("user.dir") + File.separator +"raw" + File.separator + "dict.db");
    } catch (SQLException ex) {
        System.out.println("connot connect to words.db");
        throw new Exception("Cannot connect to words.db");
    }

所以具体来说,当我运行这个命令时 java -jar ~/NetBeansProjects/RememberDict/dist/RememberDict.jar

它给出这样的错误:

connot connect to words.db
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at database.Database.getFavWords(Database.java:122)
at rememberdict.FavoritesPanel.<init>(FavoritesPanel.java:36)
at rememberdict.GUIController.<init>(GUIController.java:62)
at rememberdict.RememberDict$1.run(RememberDict.java:11)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

编辑:

我想我找到了解决方案,我的数据库文件(dict.db)位于原始文件夹中,该文件夹与 jar 文件位于同一文件夹中。实际上我想从 jar 文件存在的位置加载数据库文件。使用以前的代码java无法找到数据库文件并且抛出这些异常,过了一会儿我想出了这个解决方案:

String separator = File.separator;
String databasePath = Database.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String currentDir = databasePath.substring(0, databasePath.lastIndexOf(separator) + 1) + "raw" + separator + "dict.db";
conn = DriverManager.getConnection("jdbc:sqlite:" + currentDir);

我认为,如果我们从 jar 文件存在的位置运行应用程序,尽管没有找到该文件,以前的代码仍然可以加载数据库文件。

最佳答案

System.getProperty("user.dir") 将返回程序运行的目录,而不是主文件夹。

因此在这种情况下,sqlite 文件应该始终与您的 java 程序所在的文件夹相同。

关于java - 当程序从另一个目录运行时 DriverManager.getConnection 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26084653/

相关文章:

java - 为什么我的 MultipartFile 是空的

java - 我的 JPanel 不会显示。 Eclipse 说我没有错误。 java

c# - Linux 和 Csharp,检查 Linux 中是否存在文件/文件夹,如果存在,则通过 Csharp SSH 运行 MKDIR -

c++ - 无需轮询即可更改时间

php - Laravel 时间戳计算

android - 以下案例如何管理 SQLite 数据库

java - 如何在 Java 中使用 PDFBox 获取 PDF 文件中的所有书签

java - 临时存储/查询数据的最佳方法?

linux - 编译后如何将程序设置为 "install",以便我可以从命令行运行它?

python - 属性错误 : 'function' object has no attribute 'connect'