我通过URL加入内部文件后可以删除JAR吗?

时间:2013-01-21 10:43:15

标签: java url groovy

在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通常不在类路径上。有没有办法让这段代码有效?

2 个答案:

答案 0 :(得分:2)

尝试设置sun.zip.disableMemoryMapping系统属性:

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

(或者在调用Gradle时设置系统属性)。 ZipFile(支持jar:个网址)默认使用内存映射,这可能会导致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()

答案 1 :(得分: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文件