Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
My question relates to Spring-boot-loader v2.6.15. For the purposes of this question, I will refer to Spring's custom JarFile class as CustomJarFile to avoid confusion. Context I am reusing so...
#1: Initial revision
What is the purpose of having a wrapper class for JarFile in Spring-boot-loader?
My question relates to [Spring-boot-loader v2.6.15](https://github.com/spring-projects/spring-boot/tree/v2.6.15/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar). For the purposes of this question, I will refer to Spring's custom `JarFile` class as `CustomJarFile` to avoid confusion. ---- ## Context I am reusing some of the jar package code in spring-boot-loader. I noticed that they define their own [`CustomJarFile` implementation](https://github.com/spring-projects/spring-boot/blob/v2.6.15/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java) that (most relevant to this question) overrides the `close()` method like so: ``` @Override public void close() throws IOException { if (this.closed) { return; } super.close(); if (this.type == JarFileType.DIRECT) { this.rootFile.close(); } this.closed = true; } ``` They also define a [`JarFileWrapper`](https://github.com/spring-projects/spring-boot/blob/v2.6.15/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFileWrapper.java) class that **does not** override the close method. The custom [`JarUrlConnection#get()`](https://github.com/spring-projects/spring-boot/blob/v2.6.15/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarURLConnection.java#L266) method notably returns an instance with the wrapper rather than the jar itself like so: ``` static JarURLConnection get(URL url, JarFile jarFile) throws IOException { // some stuff here... return new JarURLConnection(url, jarFile.getWrapper(), jarEntryName); // JarFile here is the custom class } ``` Testing the code without the wrapper class by returning a `JarUrlConnection` with the `CustomJarFile` itself rather than its wrapper results in a "zip file closed" exception. This is reasonable given that when you call `close()` on the wrapper, it will call the `close()` method of the `ZipFile` class. However, if the `JarFile` itself is sent, it will call the `close()` method of the `JarFile` since it is overriden. Notably, The JavaDoc of the wrapper class states: > A wrapper used to create a copy of a {@link CustomJarFile} so that it can be safely closed without closing the original. ---- ## Question I do not quite understand the purpose of using a wrapper here. If the goal is to just avoid closing the `CustomJarFile`, wouldn't simply not overriding the `close()` method in `CustomJarFile` (allowing it to propogate to `ZipFile`) have the same effect as using a wrapper? It feels like we just added a redundant layer. While debugging, I've noticed that the `close()` method of `CustomJarFile` is never called between startup and shutdown of the service which makes me further believe that the wrapper is pointless if you simply remove the overriden close method in `CustomJarFile`.