JarURLConnection.getJarFile() resource leak when file is not found
Neon Ngo
trineo at gmail.com
Tue Aug 25 14:27:22 UTC 2015
There are no close(), disconnect(), or similar method on
java.net.JarURLConnection nor it's super class (java.net.URLConnection).
My sample test program will close the resource when searching for an
"existing" file inside the jar file.
It only has resource leak (open file descriptor) when searching for a
non-existing file inside the jar file.
Regards,
Neon
On Fri, Aug 21, 2015 at 5:19 PM, Peter Levart <peter.levart at gmail.com>
wrote:
>
>
> On 08/17/2015 04:02 PM, Neon Ngo wrote:
>
> The test program below shows a resource leak in java.net.JarURLConnection's getJarFile() when given an non-existent file to lookup in the jar file.
>
> Under Windows, the last printout shows that it is not able to remove the test input jar file.
> Any input jar file can be used to test this as long as it does not contain "/testNonExistentFile.xyz" in the jar file.
>
> Warning, this test program will try to delete the input file, so use with a "temporary" copy of an existing jar file.
>
> This happens under all current Oracle and OpenJDK Java versions: 6, 7, and 8 (I have not tried beta versions of 9).
>
> I could not find a matching BUG for this issue on both the Oracle and OpenJDK websites.
> So would like to start the conversation here since my submission on the Oracle website almost a month ago seems to have been lost.
>
>
> Anyone know of a workaround for this issue?
>
>
> Hi Neon,
>
> Have you tried closing the JarURLConnection before trying to delete the
> jar file?
>
> Regards, Peter
>
>
> Regards,
>
>
> Neon
>
> === test.java ===
> package nxm.test.lib;
>
> import java.io.File;
> import java.net.JarURLConnection;
> import java.net.URL;
> import java.net.URLConnection;
> import java.util.jar.JarFile;
>
> public class test {
>
> public static void getJarFile(String urlstr) throws Exception {
> System.out.println("testing URL: " + urlstr);
> URL url = new URL(urlstr);
> URLConnection urlConnection = url.openConnection();
> if (urlConnection instanceof JarURLConnection) {
> JarURLConnection jarUrlConnection = (JarURLConnection) urlConnection;
> JarFile jarFile = jarUrlConnection.getJarFile();
> System.out.println(" Got JarFile : " + jarFile);
> System.out.println(" JarFile.name : " + ((jarFile != null) ? jarFile.getName() : ""));
> jarFile.close();
> System.out.println(" Closed JarFile " + jarFile);
>
> } else if (urlConnection != null) {
> System.err.println(" URLConnection.class: " + urlConnection.getClass());
> }
> }
>
> public static void main(String[] args) {
> if (args.length < 1) {
> error("Usage: <file.jar>");
> }
> String jarFilename = args[0];
> File file = new File(jarFilename);
> if (!file.exists()) {
> error("input jar file does not exists: " + file);
> }
>
> String nonExistentFileInJar = "jar:file:" + jarFilename + "!/testNonExistentFile.xyz";
> try {
> getJarFile(nonExistentFileInJar);
> } catch (Exception e) {
> e.printStackTrace();
> }
>
> boolean result = file.delete();
> System.out.println("Able to remove test jar file? " + result);
>
> if (!result) {
> error("Unable to remove test jar file: " + jarFilename);
> }
> }
>
> static void error(String msg) {
> System.err.println(msg);
> System.exit(1);
> }
> }
>
> === end test.java ===
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/net-dev/attachments/20150825/c4b1fdec/attachment.html>
More information about the net-dev
mailing list