mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-15 14:13:56 +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) {
|
public PaperPluginClassLoader buildClassLoader(Logger logger, Path source, JarFile jarFile, PaperPluginMeta configuration) {
|
||||||
PaperLibraryStore paperLibraryStore = new PaperLibraryStore();
|
List<Path> paths = this.buildLibraryPaths(true);
|
||||||
for (ClassPathLibrary library : this.libraries) {
|
|
||||||
library.register(paperLibraryStore);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Path> paths = paperLibraryStore.getPaths();
|
|
||||||
if (PluginInitializerManager.instance().pluginRemapper != null) {
|
|
||||||
paths = PluginInitializerManager.instance().pluginRemapper.remapLibraries(paths);
|
|
||||||
}
|
|
||||||
URL[] urls = new URL[paths.size()];
|
URL[] urls = new URL[paths.size()];
|
||||||
for (int i = 0; i < paths.size(); i++) {
|
for (int i = 0; i < paths.size(); i++) {
|
||||||
Path path = paths.get(i);
|
Path path = paths.get(i);
|
||||||
|
@ -69,4 +61,17 @@ public class PaperClasspathBuilder implements PluginClasspathBuilder {
|
||||||
throw new RuntimeException(exception);
|
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 PluginDescriptionFile description;
|
||||||
private final JarFile jarFile;
|
private final JarFile jarFile;
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
|
private final List<Path> paperLibraryPaths;
|
||||||
private final ComponentLogger componentLogger;
|
private final ComponentLogger componentLogger;
|
||||||
private ProviderStatus status;
|
private ProviderStatus status;
|
||||||
private DependencyContext dependencyContext;
|
private DependencyContext dependencyContext;
|
||||||
|
|
||||||
SpigotPluginProvider(Path path, JarFile file, PluginDescriptionFile description) {
|
SpigotPluginProvider(Path path, JarFile file, PluginDescriptionFile description, List<Path> paperLibraryPaths) {
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.jarFile = file;
|
this.jarFile = file;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.logger = PaperPluginLogger.getLogger(description);
|
this.logger = PaperPluginLogger.getLogger(description);
|
||||||
|
this.paperLibraryPaths = paperLibraryPaths;
|
||||||
this.componentLogger = ComponentLogger.logger(this.logger.getName());
|
this.componentLogger = ComponentLogger.logger(this.logger.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +122,7 @@ public class SpigotPluginProvider implements PluginProvider<JavaPlugin>, Provide
|
||||||
|
|
||||||
final PluginClassLoader loader;
|
final PluginClassLoader loader;
|
||||||
try {
|
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) {
|
} catch (InvalidPluginException ex) {
|
||||||
throw ex;
|
throw ex;
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
|
|
|
@ -1,9 +1,18 @@
|
||||||
package io.papermc.paper.plugin.provider.type.spigot;
|
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.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.configuration.serializer.constraints.PluginConfigConstraints;
|
||||||
import io.papermc.paper.plugin.provider.type.PluginTypeFactory;
|
import io.papermc.paper.plugin.provider.type.PluginTypeFactory;
|
||||||
|
import io.papermc.paper.plugin.provider.util.ProviderUtil;
|
||||||
import io.papermc.paper.util.MappingEnvironment;
|
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.InvalidDescriptionException;
|
||||||
import org.bukkit.plugin.PluginDescriptionFile;
|
import org.bukkit.plugin.PluginDescriptionFile;
|
||||||
import org.bukkit.plugin.java.LibraryLoader;
|
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.");
|
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
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue