首页 > 解决方案 > 无法使用文件选择器访问 sqlite.db 文件(Java Swing 项目)

问题描述

我无法从远程路径访问 .db 文件,例如

jdbc:sqlite:D:\test\fnovel.db
jdbc:sqlite:C:\Users\2401k\Nox_share\Download\fnovel.db

项目代码(不太复杂的简单连接)

connection = DriverManager.getConnection("jdbc:sqlite:"+path);

当我尝试运行可执行 jar 时,它工作正常,当我尝试从 intellj 项目中使用时,这是我尝试运行可执行 jar 时遇到的错误

java.sql.SQLException: No suitable driver found for jdbc:sqlite:D:\test\fnovel.db
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251)
at com.lingamworks.Contentfram.extractfromsqlite(Contentfram.java:71)
at com.lingamworks.Contentfram$2.actionPerformed(Contentfram.java:55)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6635)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6400)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5011)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

fnovel.db 文件是使用文件选择器选择的,我从中使用绝对路径。我不能包含 .db 文件,因为它的数据是从 Nox 模拟器中提取的。让我知道是否可以使用 PHP 完成相同的项目而没有任何错误我尝试使用 java 因为我无法在我想使用该程序时手动启动/停止 xampp

当我Class.forName("org.sqlite.JDBC");在连接之前添加时java.lang.ClassNotFoundException: org.sqlite.JDBC出现错误

标签: javasqliteswingintellij-ideasqlitejdbc

解决方案


依赖范围配置不正确,您将其设置为提供,而对于此特定用例,它应该是编译或运行时:

范围

为了使 jar 正常工作,必须在 jar 中提取依赖项(Extract Into Output Root选项),如果将其他 jar 放在主 jar 中,它将无法正常工作,这是固定的工件配置:

固定工件

有关更多详细信息和示例项目,请参阅此答案


推荐阅读