0

私は最近、自分の 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 で実行する必要があり、インストーラーのセットアップ方法が複雑になります。

どんな助けでも大歓迎です。

4

3 に答える 3

1

このディレクトリへの書き込みアクセス権がないようです。データベース ファイルは、アクセス権のあるディレクトリに保存する必要があります。

H2 の場合、データベース URL を使用するjdbc:h2:~/data/dbと、データベースは現在のユーザーのホーム ディレクトリを基準にして保存されます。別の方法として、絶対パスを使用することもできます。たとえば、jdbc:h2:c:/dir/to/db/file

于 2013-01-21T08:52:14.197 に答える
0

Mac OS X では、ここuser.homeで引用されている既知のサブディレクトリを使用できます。

私はまだ試していませんが、適切な権限を持つJava Web Startが代替手段になるかもしれません。

于 2013-01-21T04:29:19.020 に答える
0

これは、Windows のセキュリティが向上したことが原因です。昇格した特権がある場合にのみ書き込みできます。たとえば、プログラムを「管理者として実行」として起動すると、Program Files 領域に書き込むことができる場合があります。次に、それは良い考えではありません-次を参照してください: プログラムファイルフォルダーに対するWindowsのアクセス許可制限をバイパスする

「ProgramData」変数が指すフォルダーを使用する必要があります。または古き良きuser.homeエリア

于 2013-01-21T04:20:29.570 に答える