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 ===

Reply via email to