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
This commit is contained in:
Jason Penilla 2021-05-18 14:42:26 -07:00
parent d4d8262f6e
commit e183355647
4 changed files with 40 additions and 1 deletions

View File

@ -83,6 +83,20 @@ public final class Bukkit {
return server;
}
/**
* 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();
}
/**
* Attempts to set the {@link Server} singleton.
* <p>

View File

@ -68,6 +68,18 @@ import org.jetbrains.annotations.Nullable;
*/
public interface Server extends PluginMessageRecipient, net.kyori.adventure.audience.ForwardingAudience { // Paper
/**
* 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();
/**
* Used for all administrative messages, such as an operator using a
* command.

View File

@ -117,9 +117,22 @@ 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
if (true) {
List<Plugin> pluginList = new ArrayList<>();
java.util.Collections.addAll(pluginList, this.paperPluginManager.loadPlugins(directory));
for (File file : extraPluginJars) {
try {
pluginList.add(this.paperPluginManager.loadPlugin(file));
} catch (Exception e) {
this.server.getLogger().log(Level.SEVERE, "Plugin loading error!", e);
}
}
return pluginList.toArray(new Plugin[0]);
}
Preconditions.checkArgument(directory != null, "Directory cannot be null");

View File

@ -93,7 +93,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());