182 lines
11 KiB
Diff
182 lines
11 KiB
Diff
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/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
|
|
index 5ec72f013c6c94a6590e78e87d2f97e57176c6a1..3a31dedebc3f89326ead64fbd0aad556d1650802 100644
|
|
--- a/src/main/java/org/bukkit/Bukkit.java
|
|
+++ b/src/main/java/org/bukkit/Bukkit.java
|
|
@@ -2053,6 +2053,20 @@ public final class Bukkit {
|
|
return server.getCurrentTick();
|
|
}
|
|
|
|
+ /**
|
|
+ * Returns the de facto plugins directory, generally used for storing plugin jars to be loaded,
|
|
+ * as well as their {@link org.bukkit.plugin.Plugin#getDataFolder() data folders}.
|
|
+ *
|
|
+ * <p>Plugins should use {@link org.bukkit.plugin.Plugin#getDataFolder()} rather than traversing this
|
|
+ * directory manually when determining the location in which to store their data and configuration files.</p>
|
|
+ *
|
|
+ * @return plugins directory
|
|
+ */
|
|
+ @NotNull
|
|
+ public static File getPluginsFolder() {
|
|
+ return server.getPluginsFolder();
|
|
+ }
|
|
+
|
|
/**
|
|
* Checks if the server is in the process of being shutdown.
|
|
*
|
|
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
|
|
index 1db87711dd9b67bcba42e731c8c1a81502abf56c..c34cfba8f9ed7e9dbd0b6b8ffef9fba46abff046 100644
|
|
--- a/src/main/java/org/bukkit/Server.java
|
|
+++ b/src/main/java/org/bukkit/Server.java
|
|
@@ -1804,6 +1804,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
|
*/
|
|
int getCurrentTick();
|
|
|
|
+ /**
|
|
+ * Returns the de facto plugins directory, generally used for storing plugin jars to be loaded,
|
|
+ * as well as their {@link org.bukkit.plugin.Plugin#getDataFolder() data folders}.
|
|
+ *
|
|
+ * <p>Plugins should use {@link org.bukkit.plugin.Plugin#getDataFolder()} rather than traversing this
|
|
+ * directory manually when determining the location in which to store their data and configuration files.</p>
|
|
+ *
|
|
+ * @return plugins directory
|
|
+ */
|
|
+ @NotNull
|
|
+ File getPluginsFolder();
|
|
+
|
|
/**
|
|
* Checks if the server is in the process of being shutdown.
|
|
*
|
|
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
index 20b4ef7a94e00d9264b8ecc126ce5853b584ea8c..0d9d729a18b5388b06ab0a3749e55f91f838be88 100644
|
|
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
@@ -115,6 +115,12 @@ 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<File> extraPluginJars) {
|
|
+ // Paper end
|
|
Validate.notNull(directory, "Directory cannot be null");
|
|
Validate.isTrue(directory.isDirectory(), "Directory must be a directory");
|
|
|
|
@@ -132,7 +138,11 @@ public final class SimplePluginManager implements PluginManager {
|
|
Map<String, Collection<String>> softDependencies = new HashMap<String, Collection<String>>();
|
|
|
|
// This is where it figures out all possible plugins
|
|
- for (File file : directory.listFiles()) {
|
|
+ // Paper start - extra jars
|
|
+ final List<File> 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());
|
|
@@ -148,14 +158,14 @@ 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;
|
|
}
|
|
|
|
@@ -166,7 +176,7 @@ public final class SimplePluginManager implements PluginManager {
|
|
description.getName(),
|
|
file.getPath(),
|
|
replacedFile.getPath(),
|
|
- directory.getPath()
|
|
+ file.getParentFile().getPath() // Paper
|
|
));
|
|
}
|
|
|
|
@@ -187,7 +197,7 @@ 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());
|
|
@@ -269,7 +279,7 @@ 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;
|
|
}
|
|
@@ -308,11 +318,11 @@ 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
|
|
}
|
|
}
|
|
}
|
|
@@ -339,11 +349,11 @@ 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
|
|
}
|
|
}
|
|
}
|
|
@@ -356,7 +366,7 @@ 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 80236a0934861902db7f15571d0d9b4902e70045..d2712f45dbcf26fabe8463d99f378bf422c66970 100644
|
|
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
@@ -94,7 +94,7 @@ public final class JavaPluginLoader implements PluginLoader {
|
|
throw new InvalidPluginException(ex);
|
|
}
|
|
|
|
- final File parentFile = file.getParentFile();
|
|
+ final File parentFile = this.server.getPluginsFolder(); // Paper
|
|
final File dataFolder = new File(parentFile, description.getName());
|
|
@SuppressWarnings("deprecation")
|
|
final File oldDataFolder = new File(parentFile, description.getRawName());
|