|
|
|
@ -26,8 +26,11 @@ import java.net.URL;
|
|
|
|
|
import java.net.URLStreamHandler;
|
|
|
|
|
import java.net.URLStreamHandlerFactory;
|
|
|
|
|
import java.security.Permission;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
import java.util.Enumeration;
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Spliterator;
|
|
|
|
|
import java.util.Spliterators;
|
|
|
|
|
import java.util.function.Supplier;
|
|
|
|
@ -93,6 +96,8 @@ public class JarFile extends AbstractJarFile implements Iterable<java.util.jar.J
|
|
|
|
|
|
|
|
|
|
private volatile JarFileWrapper wrapper;
|
|
|
|
|
|
|
|
|
|
private final List<JarFile> nestedJars = Collections.synchronizedList(new ArrayList<>());
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create a new {@link JarFile} backed by the specified file.
|
|
|
|
|
* @param file the root jar file
|
|
|
|
@ -335,8 +340,10 @@ public class JarFile extends AbstractJarFile implements Iterable<java.util.jar.J
|
|
|
|
|
+ "mechanism used to create your executable jar file");
|
|
|
|
|
}
|
|
|
|
|
RandomAccessData entryData = this.entries.getEntryData(entry.getName());
|
|
|
|
|
return new JarFile(this.rootFile, this.pathFromRoot + "!/" + entry.getName(), entryData,
|
|
|
|
|
JarFile nestedJar = new JarFile(this.rootFile, this.pathFromRoot + "!/" + entry.getName(), entryData,
|
|
|
|
|
JarFileType.NESTED_JAR);
|
|
|
|
|
this.nestedJars.add(nestedJar);
|
|
|
|
|
return nestedJar;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -361,6 +368,12 @@ public class JarFile extends AbstractJarFile implements Iterable<java.util.jar.J
|
|
|
|
|
if (this.type == JarFileType.DIRECT) {
|
|
|
|
|
this.rootFile.close();
|
|
|
|
|
}
|
|
|
|
|
if (this.wrapper != null) {
|
|
|
|
|
this.wrapper.close();
|
|
|
|
|
}
|
|
|
|
|
for (JarFile nestedJar : this.nestedJars) {
|
|
|
|
|
nestedJar.close();
|
|
|
|
|
}
|
|
|
|
|
this.closed = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|