From a3b68be22d1d2846c11f311daf21255fe72062d6 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 18 May 2021 15:17:24 -0700 Subject: [PATCH] Add command line option to load extra plugin jars not in the plugins folder ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar --- ...-option-to-load-extra-plugin-jars-no.patch | 142 ++++++++++++++++++ ...-option-to-load-extra-plugin-jars-no.patch | 64 ++++++++ 2 files changed, 206 insertions(+) create mode 100644 Spigot-API-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch create mode 100644 Spigot-Server-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch diff --git a/Spigot-API-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch b/Spigot-API-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch new file mode 100644 index 0000000000..88bfaae85c --- /dev/null +++ b/Spigot-API-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch @@ -0,0 +1,142 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> +Date: Tue, 18 May 2021 14:42:26 -0700 +Subject: [PATCH] Add command line option to load extra plugin jars not in the + plugins folder + +ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar + +diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java ++++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + private final Map> permSubs = new HashMap>(); + private final Map> defSubs = new HashMap>(); + private boolean useTimings = false; ++ private File pluginsDirectory; public @Nullable File pluginsDirectory() { return this.pluginsDirectory; } // Paper + + public SimplePluginManager(@NotNull Server instance, @NotNull SimpleCommandMap commandMap) { + server = instance; +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + @Override + @NotNull + public Plugin[] loadPlugins(@NotNull File directory) { ++ // Paper start - extra jars ++ return this.loadPlugins(directory, java.util.Collections.emptyList()); ++ } ++ @NotNull ++ public Plugin[] loadPlugins(final @NotNull File directory, final @NotNull List extraPluginJars) { ++ this.pluginsDirectory = directory; ++ // Paper end + Validate.notNull(directory, "Directory cannot be null"); + Validate.isTrue(directory.isDirectory(), "Directory must be a directory"); + +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + Map> softDependencies = new HashMap>(); + + // This is where it figures out all possible plugins +- for (File file : directory.listFiles()) { ++ // Paper start - extra jars ++ final List pluginJars = new ArrayList<>(java.util.Arrays.asList(directory.listFiles())); ++ pluginJars.addAll(extraPluginJars); ++ for (File file : pluginJars) { ++ // Paper end + PluginLoader loader = null; + for (Pattern filter : filters) { + Matcher match = filter.matcher(file.getName()); +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + description = loader.getPluginDescription(file); + String name = description.getName(); + if (name.equalsIgnoreCase("bukkit") || name.equalsIgnoreCase("minecraft") || name.equalsIgnoreCase("mojang")) { +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "': Restricted Name"); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "': Restricted Name"); // Paper + continue; + } else if (description.rawName.indexOf(' ') != -1) { +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "': uses the space-character (0x20) in its name"); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "': uses the space-character (0x20) in its name"); // Paper + continue; + } + } catch (InvalidDescriptionException ex) { +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'", ex); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'", ex); // Paper + continue; + } + +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + description.getName(), + file.getPath(), + replacedFile.getPath(), +- directory.getPath() ++ file.getParentFile().getPath() // Paper + )); + } + +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + file.getPath(), + provided, + pluginFile.getPath(), +- directory.getPath() ++ file.getParentFile().getPath() // Paper + )); + } else { + String replacedPlugin = pluginsProvided.put(provided, description.getName()); +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + + server.getLogger().log( + Level.SEVERE, +- "Could not load '" + entry.getValue().getPath() + "' in folder '" + directory.getPath() + "'", ++ "Could not load '" + entry.getValue().getPath() + "' in folder '" + entry.getValue().getParentFile().getPath() + "'", // Paper + new UnknownDependencyException("Unknown dependency " + dependency + ". Please download and install " + dependency + " to run this plugin.")); + break; + } +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + loadedPlugins.add(loadedPlugin.getName()); + loadedPlugins.addAll(loadedPlugin.getDescription().getProvides()); + } else { +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'"); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'"); // Paper + } + continue; + } catch (InvalidPluginException ex) { +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'", ex); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'", ex); // Paper + } + } + } +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + loadedPlugins.add(loadedPlugin.getName()); + loadedPlugins.addAll(loadedPlugin.getDescription().getProvides()); + } else { +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'"); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'"); // Paper + } + break; + } catch (InvalidPluginException ex) { +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'", ex); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'", ex); // Paper + } + } + } +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + while (failedPluginIterator.hasNext()) { + File file = failedPluginIterator.next(); + failedPluginIterator.remove(); +- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "': circular dependency detected"); ++ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "': circular dependency detected"); // Paper + } + } + } +diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +@@ -0,0 +0,0 @@ public final class JavaPluginLoader implements PluginLoader { + throw new InvalidPluginException(ex); + } + +- final File parentFile = file.getParentFile(); ++ final File parentFile = ((SimplePluginManager) this.server.getPluginManager()).pluginsDirectory(); // Paper + final File dataFolder = new File(parentFile, description.getName()); + @SuppressWarnings("deprecation") + final File oldDataFolder = new File(parentFile, description.getRawName()); diff --git a/Spigot-Server-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch b/Spigot-Server-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch new file mode 100644 index 0000000000..de900ec33c --- /dev/null +++ b/Spigot-Server-Patches/Add-command-line-option-to-load-extra-plugin-jars-no.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> +Date: Tue, 18 May 2021 14:39:44 -0700 +Subject: [PATCH] Add command line option to load extra plugin jars not in the + plugins folder + +ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar + +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -0,0 +0,0 @@ public final class CraftServer implements Server { + + File pluginFolder = (File) console.options.valueOf("plugins"); + +- if (pluginFolder.exists()) { +- Plugin[] plugins = pluginManager.loadPlugins(pluginFolder); ++ // Paper start ++ if (true || pluginFolder.exists()) { ++ if (!pluginFolder.exists()) { ++ pluginFolder.mkdirs(); ++ } ++ Plugin[] plugins = pluginManager.loadPlugins(pluginFolder, this.extraPluginJars()); ++ // Paper end + for (Plugin plugin : plugins) { + try { + String message = String.format("Loading %s", plugin.getDescription().getFullName()); +@@ -0,0 +0,0 @@ public final class CraftServer implements Server { + } + } + ++ // Paper start ++ private List extraPluginJars() { ++ @SuppressWarnings("unchecked") ++ final List jars = (List) this.console.options.valuesOf("add-plugin"); ++ return jars.stream() ++ .filter(File::exists) ++ .filter(File::isFile) ++ .filter(file -> file.getName().endsWith(".jar")) ++ .collect(java.util.stream.Collectors.toList()); ++ } ++ // Paper end ++ + public void enablePlugins(PluginLoadOrder type) { + if (type == PluginLoadOrder.STARTUP) { + helpMap.clear(); +diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/craftbukkit/Main.java ++++ b/src/main/java/org/bukkit/craftbukkit/Main.java +@@ -0,0 +0,0 @@ public class Main { + .ofType(String.class) + .defaultsTo("Unknown Server") + .describedAs("Name"); ++ ++ acceptsAll(asList("add-plugin", "add-extra-plugin-jar")) ++ .withRequiredArg() ++ .ofType(File.class) ++ .defaultsTo(new File[] {}) ++ .describedAs("Specify paths to extra plugin jars to be loaded in addition to those in the plugins folder. This argument can be specified multiple times, once for each extra plugin jar path."); + // Paper end + } + };