From 05c9ca5951830ab0e85e00a9d8071a17e95727da Mon Sep 17 00:00:00 2001 From: Luck Date: Sun, 23 May 2021 11:27:45 +0100 Subject: [PATCH] Properly cleanup JarInJarClassLoader when plugin disables --- .../common/loader/JarInJarClassLoader.java | 15 +++++++++++++++ .../common/plugin/AbstractLuckPermsPlugin.java | 3 +++ .../plugin/classpath/ClassPathAppender.java | 6 +++++- .../classpath/JarInJarClassPathAppender.java | 11 +++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/common/loader-utils/src/main/java/me/lucko/luckperms/common/loader/JarInJarClassLoader.java b/common/loader-utils/src/main/java/me/lucko/luckperms/common/loader/JarInJarClassLoader.java index 381952a3e..6bcf98269 100644 --- a/common/loader-utils/src/main/java/me/lucko/luckperms/common/loader/JarInJarClassLoader.java +++ b/common/loader-utils/src/main/java/me/lucko/luckperms/common/loader/JarInJarClassLoader.java @@ -33,6 +33,7 @@ import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; /** @@ -64,6 +65,20 @@ public class JarInJarClassLoader extends URLClassLoader { addURL(url); } + public void deleteJarResource() { + URL[] urls = getURLs(); + if (urls.length == 0) { + return; + } + + try { + Path path = Paths.get(urls[0].toURI()); + Files.deleteIfExists(path); + } catch (Exception e) { + // ignore + } + } + /** * Creates a new plugin instance. * diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java b/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java index 63576ab56..e8b2ef511 100644 --- a/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java +++ b/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java @@ -255,6 +255,9 @@ public abstract class AbstractLuckPermsPlugin implements LuckPermsPlugin { // shutdown async executor pool getBootstrap().getScheduler().shutdownExecutor(); + // close classpath appender + getBootstrap().getClassPathAppender().close(); + getLogger().info("Goodbye!"); } diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/ClassPathAppender.java b/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/ClassPathAppender.java index 5adf9690c..77fefcb14 100644 --- a/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/ClassPathAppender.java +++ b/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/ClassPathAppender.java @@ -30,8 +30,12 @@ import java.nio.file.Path; /** * Interface which allows access to add URLs to the plugin classpath at runtime. */ -public interface ClassPathAppender { +public interface ClassPathAppender extends AutoCloseable { void addJarToClasspath(Path file); + @Override + default void close() { + + } } diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/JarInJarClassPathAppender.java b/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/JarInJarClassPathAppender.java index 9dd74ea63..1db23f5ae 100644 --- a/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/JarInJarClassPathAppender.java +++ b/common/src/main/java/me/lucko/luckperms/common/plugin/classpath/JarInJarClassPathAppender.java @@ -27,6 +27,7 @@ package me.lucko.luckperms.common.plugin.classpath; import me.lucko.luckperms.common.loader.JarInJarClassLoader; +import java.io.IOException; import java.net.MalformedURLException; import java.nio.file.Path; @@ -48,4 +49,14 @@ public class JarInJarClassPathAppender implements ClassPathAppender { throw new RuntimeException(e); } } + + @Override + public void close() { + this.classLoader.deleteJarResource(); + try { + this.classLoader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } }