From 236fa2126f7db27de4c9e16b8b77d7e8cfbe0e35 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 21 May 2024 13:18:00 -0700 Subject: [PATCH] Allow Bukkit plugin to use Paper PluginLoader API --- .../bukkit/plugin/PluginDescriptionFile.java | 24 +++++++++++++++++++ .../org/bukkit/plugin/java/LibraryLoader.java | 17 +++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java b/paper-api/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java index d24dc9dfe1..6dfd519968 100644 --- a/paper-api/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java +++ b/paper-api/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java @@ -260,6 +260,13 @@ public final class PluginDescriptionFile implements io.papermc.paper.plugin.conf private Set awareness = ImmutableSet.of(); private String apiVersion = null; private List libraries = ImmutableList.of(); + // Paper start - plugin loader api + private String paperPluginLoader; + @org.jetbrains.annotations.ApiStatus.Internal @org.jetbrains.annotations.Nullable + public String getPaperPluginLoader() { + return this.paperPluginLoader; + } + // Paper end - plugin loader api // Paper start - oh my goddddd /** * Don't use this. @@ -1233,6 +1240,23 @@ public final class PluginDescriptionFile implements io.papermc.paper.plugin.conf } else { libraries = ImmutableList.of(); } + // Paper start - plugin loader api + if (map.containsKey("paper-plugin-loader")) { + this.paperPluginLoader = map.get("paper-plugin-loader").toString(); + } + + /* + Allow skipping the Bukkit/Spigot 'libraries' list. By default, both the 'libraries' + list and the 'paper-plugin-loader' will contribute libraries. It may be desired to only + use one or the other. (i.e. 'libraries' on Spigot and 'paper-plugin-loader' on Paper) + */ + if (map.containsKey("paper-skip-libraries")) { + String skip = map.get("paper-skip-libraries").toString(); + if (skip.equalsIgnoreCase("true")) { + this.libraries = ImmutableList.of(); + } + } + // Paper end - plugin loader api try { lazyPermissions = (Map) map.get("permissions"); diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/LibraryLoader.java b/paper-api/src/main/java/org/bukkit/plugin/java/LibraryLoader.java index 8e1b6be246..c66252802c 100644 --- a/paper-api/src/main/java/org/bukkit/plugin/java/LibraryLoader.java +++ b/paper-api/src/main/java/org/bukkit/plugin/java/LibraryLoader.java @@ -84,7 +84,13 @@ public class LibraryLoader @Nullable public ClassLoader createLoader(@NotNull PluginDescriptionFile desc) { - if ( desc.getLibraries().isEmpty() ) + // Paper start - plugin loader api + return this.createLoader(desc, null); + } + @Nullable + public ClassLoader createLoader(@NotNull PluginDescriptionFile desc, java.util.@Nullable List paperLibraryPaths) { + if ( desc.getLibraries().isEmpty() && paperLibraryPaths == null ) + // Paper end - plugin loader api { return null; } @@ -103,17 +109,20 @@ public class LibraryLoader } DependencyResult result; - try + if (!dependencies.isEmpty()) try // Paper - plugin loader api { result = repository.resolveDependencies( session, new DependencyRequest( new CollectRequest( (Dependency) null, dependencies, repositories ), null ) ); } catch ( DependencyResolutionException ex ) { throw new RuntimeException( "Error resolving libraries", ex ); - } + } else result = null; // Paper - plugin loader api List jarFiles = new ArrayList<>(); List jarPaths = new ArrayList<>(); // Paper - remap libraries - for ( ArtifactResult artifact : result.getArtifactResults() ) + // Paper start - plugin loader api + if (paperLibraryPaths != null) jarPaths.addAll(paperLibraryPaths); + if (result != null) for ( ArtifactResult artifact : result.getArtifactResults() ) + // Paper end - plugin loader api { // Paper start - remap libraries jarPaths.add(artifact.getArtifact().getFile().toPath());