3

こんにちは私は次の問題があります:

アンインストールプロセス内で、JAR(jdbc-driver)をロードします。

    URL pDriverJar = jarToDelete.toURI().toURL();
    URL[] lURLList = new URL[]{pDriverJar};
    URLClassLoader lLoader =  new URLClassLoader(lURLList, Thread.currentThread().getContextClassLoader());
    Thread.currentThread().setContextClassLoader(lLoader);
    Class<?> aClass = Class.forName("jdbc.Driver"); // was Oracle: oracle.jdbc.OracleDriver but should not be important

    if(jarToDelete.delete()){
        System.out.println("deleted");
    }else {
        jarToDelete.deleteOnExit();
    }

JVMの終了後、jarはまだ存在しています。

回避策として、一時ファイルを作成し、Jarをその一時ファイルにコピーしました。ただし、Tempfileは削除されません。

ClassLoadがGCの場合、ロードされたjarを削除できることを読みました。

誰かがアイデアを持っていますか、このファイルを削除する方法はありますか?

4

3 に答える 3

5

オペレーティングシステムによって異なります。Windowsでは使用中のファイルを削除できませんが、Linuxでは削除できます。

1つの解決策は、JVMが停止するのを待ってからファイルを削除する、2番目のプロセスを開始することです。これを使用してクラスローダーへのすべての参照をクリアしても、ファイルが解放される保証はありません。オブジェクトのガベージコレクション(またはファイナライズ)を強制する方法はありません。

別の解決策は、Jarをロードするクラスローダーを作成することです。そうすれば、あなたがそれを取り除きたいとき、あなたは瓶が閉じられていることを確信することができます。それを開いた唯一のオブジェクトがクラスローダーである場合は、それが無料であり、削除可能であると確信できます。

于 2010-10-22T14:48:23.713 に答える
2

この問題はJava7で修正されました。クラスのclose()メソッドを使用します。ClassLoader古いバージョンの場合、いくつかのオプションがあります。

  • このように、カスタムクラスローダーを作成します

  • リフレクションを使用して、すべてのJarFileインスタンスを閉じます。彼らはに住んでいますsun.misc.URLClassPath

于 2010-10-22T15:21:50.777 に答える
0

java11に必要なクラスパス上のjarファイルを削除したかったのですが、java1.8以下で問題が発生しました。jarファイルを強制終了するために別のプロセスを開始することなく、私が使用した解決策は、ファイルを0バイトにすることでした。

FileOutputStream out = new FileOutputStream(f);
out.write(new byte[0]);
out.flush(); out.close();

そして、次にアプリケーションがこのコードを起動すると、0バイトのファイルがまだマニフェストにある場合でも、なんとかコードを削除できます。

if (f.exists()){
    if (f.delete() == false) f.deleteOnExit();
}
于 2019-05-21T08:29:57.677 に答える