From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 21 May 2024 13:18:15 -0700 Subject: [PATCH] Allow Bukkit plugin to use Paper PluginLoader API diff --git a/src/main/java/io/papermc/paper/plugin/loader/PaperClasspathBuilder.java b/src/main/java/io/papermc/paper/plugin/loader/PaperClasspathBuilder.java index f9d4b33050a6fe8c2dabe8e5eec075d95dc513e0..dc106685ecb483c33c06e4f83eda27be58251aad 100644 --- a/src/main/java/io/papermc/paper/plugin/loader/PaperClasspathBuilder.java +++ b/src/main/java/io/papermc/paper/plugin/loader/PaperClasspathBuilder.java @@ -41,15 +41,7 @@ public class PaperClasspathBuilder implements PluginClasspathBuilder { } public PaperPluginClassLoader buildClassLoader(Logger logger, Path source, JarFile jarFile, PaperPluginMeta configuration) { - PaperLibraryStore paperLibraryStore = new PaperLibraryStore(); - for (ClassPathLibrary library : this.libraries) { - library.register(paperLibraryStore); - } - - List paths = paperLibraryStore.getPaths(); - if (PluginInitializerManager.instance().pluginRemapper != null) { - paths = PluginInitializerManager.instance().pluginRemapper.remapLibraries(paths); - } + List paths = this.buildLibraryPaths(true); URL[] urls = new URL[paths.size()]; for (int i = 0; i < paths.size(); i++) { Path path = paths.get(i); @@ -69,4 +61,17 @@ public class PaperClasspathBuilder implements PluginClasspathBuilder { throw new RuntimeException(exception); } } + + public List buildLibraryPaths(final boolean remap) { + PaperLibraryStore paperLibraryStore = new PaperLibraryStore(); + for (ClassPathLibrary library : this.libraries) { + library.register(paperLibraryStore); + } + + List paths = paperLibraryStore.getPaths(); + if (remap && PluginInitializerManager.instance().pluginRemapper != null) { + paths = PluginInitializerManager.instance().pluginRemapper.remapLibraries(paths); + } + return paths; + } } diff --git a/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProvider.java b/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProvider.java index 75a2b687d58d76b94f8bec111df8613f120ff74b..0fd1040ed376f19c6d5326767baaf3048ce1bfb4 100644 --- a/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProvider.java +++ b/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProvider.java @@ -40,15 +40,17 @@ public class SpigotPluginProvider implements PluginProvider, Provide private final PluginDescriptionFile description; private final JarFile jarFile; private final Logger logger; + private final List paperLibraryPaths; private final ComponentLogger componentLogger; private ProviderStatus status; private DependencyContext dependencyContext; - SpigotPluginProvider(Path path, JarFile file, PluginDescriptionFile description) { + SpigotPluginProvider(Path path, JarFile file, PluginDescriptionFile description, List paperLibraryPaths) { this.path = path; this.jarFile = file; this.description = description; this.logger = PaperPluginLogger.getLogger(description); + this.paperLibraryPaths = paperLibraryPaths; this.componentLogger = ComponentLogger.logger(this.logger.getName()); } @@ -120,7 +122,7 @@ public class SpigotPluginProvider implements PluginProvider, Provide final PluginClassLoader loader; try { - loader = new PluginClassLoader(this.getClass().getClassLoader(), this.description, dataFolder, this.path.toFile(), LIBRARY_LOADER.createLoader(this.description), this.jarFile, this.dependencyContext); // Paper + loader = new PluginClassLoader(this.getClass().getClassLoader(), this.description, dataFolder, this.path.toFile(), LIBRARY_LOADER.createLoader(this.description, this.paperLibraryPaths), this.jarFile, this.dependencyContext); // Paper } catch (InvalidPluginException ex) { throw ex; } catch (Throwable ex) { diff --git a/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProviderFactory.java b/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProviderFactory.java index fdb52ad85cfaa1d53aadcad72cec3d3c8c12c058..38075b7348ad7ca3cfece2bfae63e0cce827c694 100644 --- a/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProviderFactory.java +++ b/src/main/java/io/papermc/paper/plugin/provider/type/spigot/SpigotPluginProviderFactory.java @@ -1,9 +1,18 @@ package io.papermc.paper.plugin.provider.type.spigot; +import com.destroystokyo.paper.utils.PaperPluginLogger; +import io.papermc.paper.plugin.bootstrap.PluginProviderContextImpl; import io.papermc.paper.plugin.entrypoint.classloader.BytecodeModifyingURLClassLoader; +import io.papermc.paper.plugin.entrypoint.classloader.PaperSimplePluginClassLoader; +import io.papermc.paper.plugin.loader.PaperClasspathBuilder; +import io.papermc.paper.plugin.loader.PluginLoader; import io.papermc.paper.plugin.provider.configuration.serializer.constraints.PluginConfigConstraints; import io.papermc.paper.plugin.provider.type.PluginTypeFactory; +import io.papermc.paper.plugin.provider.util.ProviderUtil; import io.papermc.paper.util.MappingEnvironment; +import java.util.List; +import java.util.logging.Logger; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.bukkit.plugin.InvalidDescriptionException; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.LibraryLoader; @@ -36,7 +45,28 @@ class SpigotPluginProviderFactory implements PluginTypeFactory paperLibraryPaths; + if (configuration.getPaperPluginLoader() != null) { + final Logger logger = PaperPluginLogger.getLogger(configuration); + PaperClasspathBuilder builder = new PaperClasspathBuilder(PluginProviderContextImpl.create( + configuration, ComponentLogger.logger(logger.getName()), source + )); + + try ( + PaperSimplePluginClassLoader simplePluginClassLoader = new PaperSimplePluginClassLoader(source, file, configuration, this.getClass().getClassLoader()) + ) { + PluginLoader loader = ProviderUtil.loadClass(configuration.getPaperPluginLoader(), PluginLoader.class, simplePluginClassLoader); + loader.classloader(builder); + } catch (IOException e) { + throw new RuntimeException(e); + } + + paperLibraryPaths = builder.buildLibraryPaths(false); + } else { + paperLibraryPaths = null; + } + + return new SpigotPluginProvider(source, file, configuration, paperLibraryPaths); } @Override