jenkinsci / lib-file-leak-detector

Java agent that detects file handle leak
http://file-leak-detector.kohsuke.org/
MIT License
241 stars 112 forks source link

current running jar leak #30

Open cristyrye opened 7 years ago

cristyrye commented 7 years ago

I want to get a file from the current running jar, and this is my code:

public static void extractTextResource(Object obj, String includedFile, String outputFile) {

String inputFile = "/includes/" + includedFile; //this is the file location in JAR
StringBuilder sb = new StringBuilder();
InputStream inputStream = null;
    try {
        inputStream = obj.getClass().getResourceAsStream(inputFile); //this is line 33
        try (BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); Scanner scanner = new Scanner(bufferedInputStream);) {
            while (scanner.hasNextLine()) {
                sb.append(scanner.nextLine());
                sb.append(System.lineSeparator());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    } finally {
        try {
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    Files.write(Paths.get(outputFile), sb.toString().getBytes());

}

File leak detector result: 1 descriptors are open

1 D:\application.jar by thread: main on Mon May 15 17:38:12 EEST 2017

    at java.util.zip.ZipFile.<init>(Unknown Source)
    at java.util.jar.JarFile.<init>(Unknown Source)
    at java.util.jar.JarFile.<init>(Unknown Source)
    at sun.net.www.protocol.jar.URLJarFile.<init>(Unknown Source)
    at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source)
    at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source)
    at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.jar.JarURLConnection.getInputStream(Unknown Source)
    at java.net.URLClassLoader.getResourceAsStream(Unknown Source)
    at java.lang.Class.getResourceAsStream(Unknown Source)
    at com.company.FilesUtils.extractTextResource(FilesUtils.java:33)

Is my code wrong? is file leak detector wrong? is there a bug in Java Library?

cristyrye commented 7 years ago

After some tests I found out that even if I extract multiple resources from the jar, only 1 descriptor is open. For 5 extracted files there should be 5 file leaks, but there is just one. I think now it is a file leak descriptor bug.

centic9 commented 7 years ago

java itself opens the jar, but does not close it any more. So it is more a false positive, see the exclude feature for how you can remove such things from the report