mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-27 15:00:13 +01:00
Allow Bukkit plugin to use Paper PluginLoader API
This commit is contained in:
parent
e1b7819229
commit
ce6fd58a5e
3 changed files with 49 additions and 12 deletions
|
@ -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<Path> paths = paperLibraryStore.getPaths();
|
||||
if (PluginInitializerManager.instance().pluginRemapper != null) {
|
||||
paths = PluginInitializerManager.instance().pluginRemapper.remapLibraries(paths);
|
||||
}
|
||||
List<Path> 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<Path> buildLibraryPaths(final boolean remap) {
|
||||
PaperLibraryStore paperLibraryStore = new PaperLibraryStore();
|
||||
for (ClassPathLibrary library : this.libraries) {
|
||||
library.register(paperLibraryStore);
|
||||
}
|
||||
|
||||
List<Path> paths = paperLibraryStore.getPaths();
|
||||
if (remap && PluginInitializerManager.instance().pluginRemapper != null) {
|
||||
paths = PluginInitializerManager.instance().pluginRemapper.remapLibraries(paths);
|
||||
}
|
||||
return paths;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,15 +40,17 @@ public class SpigotPluginProvider implements PluginProvider<JavaPlugin>, Provide
|
|||
private final PluginDescriptionFile description;
|
||||
private final JarFile jarFile;
|
||||
private final Logger logger;
|
||||
private final List<Path> 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<Path> 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<JavaPlugin>, 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) {
|
||||
|
|
|
@ -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<SpigotPluginProvi
|
|||
throw new InvalidDescriptionException("Restricted name, cannot use 0x20 (space character) in a plugin name.");
|
||||
}
|
||||
|
||||
return new SpigotPluginProvider(source, file, configuration);
|
||||
final List<Path> 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
|
||||
|
|
Loading…
Reference in a new issue