0

Groovy で JAR 内からファイルを読み込んでいます。何らかの処理を行った後、この JAR を削除したいのですが、URL からアクセスすると削除できないようです。

例:

File jarFile = new File('jarFile.jar')
URL url = jarFile.toURI().toURL()

URL intUrl = new URL("jar:$url!/internalFile.json")
println intUrl.text // reads text correctly

jarFile.delete() // returns false, cannot delete

getText()コマンドの Javadoc によると、呼び出しの最後に接続が閉じられ、この JAR は通常クラスパス上にありません。このコードを機能させる方法はありますか?

4

2 に答える 2

2

sun.zip.disableMemoryMappingシステム プロパティを設定してみてください。

java -Dsun.zip.disableMemoryMapping=true ....

(または、Gradle を呼び出すときにシステム プロパティを設定します)。 ZipFile( jar:URL をサポートする) は既定でメモリ マッピングを使用します。これにより、問題のファイルがまだ開いていると Windows が認識している可能性があります。これがオプションでない場合は、次のcommons-compress代わりに ZipFile 実装を使用してみてくださいjava.util.zip

@Grab(group='org.apache.commons', module='commons-compress', version='1.4.1')
import org.apache.commons.compress.archivers.zip.*

File jarFile = new File('jarFile.jar')
ZipFile f = new ZipFile(jarFile)
ZipArchiveEntry json = f.getEntry('internalFile.json')
if(json) {
  f.getInputStream(json)?.withStream {
    println it.getText('UTF-8')
  }
}
f.close()
jarFile.delete()
于 2013-01-21T12:50:43.173 に答える
0

これを試すことができます:

import java.util.zip.ZipFile

File jarFile = new File( 'jarFile.jar' )

String text = new ZipFile( jarFile ).with { zf ->
  String result = zf.entries().findResult { ze ->
    if( ze.name == 'internalFile.json' ) {
      zf.getInputStream( ze ).withReader {
        it.text
      }
    }
  }
  zf.close()
  result
}

println text

jarFile.delete()

クラスローダーがjarファイルをロックするのを避けるために(私が疑っているのは)

于 2013-01-21T11:53:30.690 に答える