【问题标题】:Creating Lock file in Programs Folder causes exception在程序文件夹中创建锁定文件会导致异常
【发布时间】:2013-01-04 03:25:54
【问题描述】:

我最近决定为我的 Java 应用程序使用官方安装程序。

应用程序将其自身安装在 Programs Files 下的相应文件夹中。

在我的应用程序的 jar 所在的 bin 文件夹中,我有一个 h2.db 文件,其中包含应用程序读取的一堆信息。

当我尝试在安装位置运行应用程序时,出现异常:

org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.FileNotFoundException: C:\Program Files (x86)\Aurora Game Hub\bin\AuroraDB.lock.db (Access is denied)"; "C:/Program Files (x86)/Aurora Game Hub/bin/AuroraDB.lock.db" [90031-167]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
        at org.h2.message.DbException.get(DbException.java:158)
        at org.h2.message.DbException.convertIOException(DbException.java:315)
        at org.h2.store.fs.FilePathDisk.newOutputStream(FilePathDisk.java:265)
        at org.h2.store.fs.FileUtils.newOutputStream(FileUtils.java:223)
        at org.h2.store.FileLock.save(FileLock.java:197)
        at org.h2.store.FileLock.lockFile(FileLock.java:333)
        at org.h2.store.FileLock.lock(FileLock.java:128)
        at org.h2.engine.Database.open(Database.java:542)
        at org.h2.engine.Database.openDatabase(Database.java:222)
        at org.h2.engine.Database.<init>(Database.java:217)
        at org.h2.engine.Engine.openSession(Engine.java:56)
        at org.h2.engine.Engine.openSession(Engine.java:159)
        at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138)
        at org.h2.engine.Engine.createSession(Engine.java:121)
        at org.h2.engine.Engine.createSession(Engine.java:28)
        at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:305)
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:110)
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:94)
        at org.h2.Driver.connect(Driver.java:72)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at aurora.engine.V1.Logic.ASimpleDB.searchAprox(ASimpleDB.java:828)
        at aurora.V1.core.GameSearch.searchGame(GameSearch.java:249)
        at aurora.V1.core.GameSearch.run(GameSearch.java:346)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: C:\Program Files (x86)\Aurora Game Hub\bin\AuroraDB.lock.db (Access is denied)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at org.h2.store.fs.FilePathDisk.newOutputStream(FilePathDisk.java:257)
        ... 22 more

当它不在 Program Files 位置时,它可以正常工作,因为我在开发时会注意到这一点。

我认为这与权限有关,并且无法创建锁定文件或其他什么。有没有办法给予/要求明确的权限来创建锁定文件,或者我可以告诉 H2 不创建锁定文件?

我们曾考虑将静态数据库放置在安装位置以外的位置,但由于它必须在 Mac 和 PC 上运行,而且安装程序的设置方式会使事情变得更加复杂。

非常感谢任何帮助。

【问题讨论】:

    标签: java locking file-permissions h2


    【解决方案1】:

    似乎没有写入此目录的访问权限。您需要将数据库文件存储在您有权访问的目录中。

    对于 H2,如果您使用数据库 URL jdbc:h2:~/data/db,则数据库相对于当前用户主目录存储。另一种选择是使用绝对路径,例如jdbc:h2:c:/dir/to/db/file

    【讨论】:

      【解决方案2】:

      这是由改进的 Windows 安全性引起的。只有当你有提升的权限时你才能写。例如,如果您以“以管理员身份运行”启动程序,那么它可能能够写入程序文件区域。那么这不是一个好主意 - 请参阅:Bypass Windows permission restrictions on program files folder

      您应该使用“ProgramData”变量指向的文件夹。或良好的旧 user.home 区域

      【讨论】:

        【解决方案3】:

        在 Mac OS X 上,您可以使用 user.home 引用的 here 的已知子目录。

        Java Web Start 和合适的permissions 可能是另一种选择,虽然我还没有尝试过。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-19
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 2012-10-04
          • 1970-01-01
          • 2016-10-02
          相关资源
          最近更新 更多