【问题标题】:Can not create SQLite database on mac (permission) issues无法在 mac(权限)问题上创建 SQLite 数据库
【发布时间】:2014-07-09 00:28:44
【问题描述】:

我正在尝试将应用程序文件夹添加到 Mac 上的 Application Support 文件夹。它可以工作,但我无法写入该文件夹。当我在文件夹上执行ls -l 时,我得到:drwxr-xr-x,但由于某种原因,我无法在那里创建db 文件。

String OS = (System.getProperty("os.name")).toUpperCase();
String location;
if(OS.contains("WIN")){
    location = "/" + System.getenv("APPDATA").replace("\\", "/") + "/Phantom";
}else{
    location = System.getProperty("user.home");
    location += "/Library/Application Support/Phantom";
}
File f = new File(location);
if(!f.isDirectory()){
    f.mkdir();
}
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:" + location + "/phantom.db");

首先,这是在 mac 上存储此信息的正确位置,对吗?假设是这样,我应该怎么做才能使它起作用?

编辑轨迹:

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894)
        at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
        at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: org/sqlite/NativeDB
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1929)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1814)
        at java.lang.Runtime.load0(Runtime.java:809)
        at java.lang.System.load(System.java:1083)
        at org.sqlite.SQLiteJDBCLoader.loadNativeLibrary(SQLiteJDBCLoader.java:200)
        at org.sqlite.SQLiteJDBCLoader.extractAndLoadLibraryFile(SQLiteJDBCLoader.java:148)
        at org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBCLoader.java:249)
        at org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:65)
        at org.sqlite.core.NativeDB.load(NativeDB.java:53)
        at org.sqlite.core.CoreConnection.open(CoreConnection.java:136)
        at org.sqlite.core.CoreConnection.<init>(CoreConnection.java:66)
        at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:21)
        at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:23)
        at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:44)
        at org.sqlite.JDBC.createConnection(JDBC.java:113)
        at org.sqlite.JDBC.connect(JDBC.java:87)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:270)
        at phantom.SQLite.connect(SQLite.java:46)
        at phantom.SQLite.getUsers(SQLite.java:123)
        at phantom.Browser.loadCustomPage(Browser.java:194)
        at phantom.Main.start(Main.java:29)
        at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
        at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
        at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
        at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.ClassNotFoundException: org.sqlite.NativeDB
        at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 30 more
Exception running application phantom.Main

【问题讨论】:

  • 文件夹可能是drwxr-xr-x,但是您以什么用户身份运行此代码?由于文件夹是 755,因此只有 OWNER 对其具有写权限。如果您以其他用户身份运行,则您没有写入权限。
  • 我正在使用 Netbeans 构建和执行文件,我假设它使用当前用户构建项目,运行项目,并创建文件夹...
  • 暂时试试chmod 777 "~/Library/App...../Phantom"看看是否有帮助。
  • 因此,无论您以何种用户身份登录并运行 netbeans,都必须是该文件夹的所有者。
  • @MarkSetchell 这样做之后,我仍然无法创建数据库 db 文件...

标签: java macos sqlite permissions file-permissions


【解决方案1】:

您的堆栈跟踪显示...

NoClassDefFoundError: org/sqlite/NativeDB

我认为您可能下载了错误的 jar 并嵌入了错误的原生库。尝试here 并按照 OSX 的说明进行操作(仅关于设置类路径)。

【讨论】:

  • 该代码在 Windows 上运行,它是我已经在使用的库。
  • 不是代码。这是sqlite jar文件。 jar 包含嵌入的本机代码。如果您复制了 jar,并且该 jar 没有 OSX 本机代码,它将失败并出现此错误。
  • 就像我说的那样,这已经是我正在使用的库,所以本机代码应该已经存在...
  • 你的类路径中是否有两个 sqlite jar,其中一个是 Windows 版本?
  • 我想通了!我只需要使用旧版本的驱动程序就可以了。谢谢
猜你喜欢
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多