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-compressZipFile 实现而不是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 回答