remove library loader & jar relocator

This commit is contained in:
Pyrbu 2024-05-17 05:07:11 +02:00
parent 97732331f9
commit cefede568b
4 changed files with 0 additions and 328 deletions

@ -28,7 +28,6 @@ dependencies {
implementation "net.kyori:adventure-platform-bukkit:4.3.2"
implementation "net.kyori:adventure-text-minimessage:4.15.0"
implementation "me.lucko:jar-relocator:1.7"
implementation project(":api")
}

@ -31,57 +31,6 @@ public class ZNpcsPlusBootstrap extends JavaPlugin {
Bukkit.getPluginManager().disablePlugin(this);
return;
}
/*
getLogger().info("Downloading and loading libraries, this might take a while if this is the first time you're launching the plugin");
LibraryLoader loader = new LibraryLoader(this, new File(getDataFolder(), "libraries"));
loader.addRelocation(decrypt("org..bstats"), "lol.pyr.znpcsplus.libraries.bstats");
loader.addRelocation(decrypt("me..robertlit..spigotresources"), "lol.pyr.znpcsplus.libraries.spigotresources");
loader.addRelocation(decrypt("net..kyori"), "lol.pyr.znpcsplus.libraries.kyori");
loader.addRelocation(decrypt("org..checkerframework"), "lol.pyr.znpcsplus.libraries.checkerframework");
loader.addRelocation(decrypt("com..google"), "lol.pyr.znpcsplus.libraries.google");
loader.addRelocation(decrypt("com..github..retrooper..packetevents"), "lol.pyr.znpcsplus.libraries.packetevents.api");
loader.addRelocation(decrypt("io..github..retrooper..packetevents"), "lol.pyr.znpcsplus.libraries.packetevents.impl");
loader.addRelocation(decrypt("org..yaml..snakeyaml"), "lol.pyr.znpcsplus.libraries.snakeyaml");
loader.addRelocation(decrypt("space..arim..dazzleconf"), "lol.pyr.znpcsplus.libraries.dazzleconf");
loader.addRelocation(decrypt("lol..pyr..director"), "lol.pyr.znpcsplus.libraries.command");
loader.loadLibrary(decrypt("com..google..guava"), "guava", "18.0");
loader.loadLibrary(decrypt("com..google..code..gson"), "gson", "2.10.1");
loader.loadLibrary(decrypt("org..bstats"), "bstats-base", "3.0.2");
loader.loadLibrary(decrypt("org..bstats"), "bstats-bukkit", "3.0.2");
loader.loadLibrary("me.robertlit", "SpigotResourcesAPI", "2.0", "https://repo.pyr.lol/releases");
loader.loadLibrary(decrypt("com..github..retrooper..packetevents"), "api", "2.3.0", "https://repo.codemc.io/repository/maven-releases/");
loader.loadLibrary(decrypt("com..github..retrooper..packetevents"), "spigot", "2.3.0", "https://repo.codemc.io/repository/maven-releases/");
loader.loadLibrary(decrypt("space..arim..dazzleconf"), "dazzleconf-core", "1.2.1");
loader.loadLibrary(decrypt("space..arim..dazzleconf"), "dazzleconf-ext-snakeyaml", "1.2.1");
loader.loadLibrary("org.yaml", "snakeyaml", "1.33");
loader.loadLibrary("lol.pyr", "director-adventure", "2.1.1", "https://repo.pyr.lol/releases");
loader.loadLibrary(decrypt("net..kyori"), "adventure-api", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-key", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-nbt", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-platform-facet", "4.3.2");
loader.loadLibrary(decrypt("net..kyori"), "adventure-platform-api", "4.3.2");
loader.loadLibrary(decrypt("net..kyori"), "adventure-platform-bukkit", "4.3.2");
loader.loadLibrary(decrypt("net..kyori"), "adventure-text-minimessage", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-text-serializer-bungeecord", "4.3.2");
loader.loadLibrary(decrypt("net..kyori"), "adventure-text-serializer-gson", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-text-serializer-gson-legacy-impl", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-text-serializer-json", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-text-serializer-json-legacy-impl", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "adventure-text-serializer-legacy", "4.15.0");
loader.loadLibrary(decrypt("net..kyori"), "examination-api", "1.3.0");
loader.loadLibrary(decrypt("net..kyori"), "examination-string", "1.3.0");
loader.deleteUnloadedLibraries();
getLogger().info("Loaded " + loader.loadedLibraryCount() + " libraries!");
*/
zNpcsPlus = new ZNpcsPlus(this);
}
@ -121,9 +70,4 @@ public class ZNpcsPlusBootstrap extends JavaPlugin {
public boolean movedLegacy() {
return legacy;
}
// Ugly hack because of https://github.com/johnrengelman/shadow/issues/232
private static String decrypt(String packageName) {
return packageName.replace("..", ".");
}
}

@ -1,119 +0,0 @@
package lol.pyr.znpcsplus.libraries;
import me.lucko.jarrelocator.JarRelocator;
import me.lucko.jarrelocator.Relocation;
import org.bukkit.plugin.Plugin;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
public class LibraryLoader {
private final static Logger logger = Logger.getLogger("ZNPCsPlus Library Loader");
private final UrlClassLoaderAccess loaderAccess;
private final File librariesFolder;
private final Set<File> loadedLibraries = new HashSet<>();
private final List<Relocation> relocationRules = new ArrayList<>();
public LibraryLoader(Plugin plugin, File librariesFolder) {
loaderAccess = UrlClassLoaderAccess.create((URLClassLoader) plugin.getClass().getClassLoader());
this.librariesFolder = librariesFolder;
if (!librariesFolder.exists()) librariesFolder.mkdirs();
}
public void deleteUnloadedLibraries() {
File[] files = librariesFolder.listFiles();
if (files == null) return;
for (File file : files) if (!loadedLibraries.contains(file)) file.delete();
}
public void addRelocation(String pre, String post) {
relocationRules.add(new Relocation(pre, post));
}
public void loadSnapshotLibrary(String groupId, String artifactId, String version, String snapshotVersion, String repoUrl) {
try {
loadLibrary(groupId + ":" + artifactId + ":" + version,
getDependencyFile(groupId, artifactId, version),
getSnapshotDependencyUrl(groupId, artifactId, version, snapshotVersion, repoUrl));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public int loadedLibraryCount() {
return loadedLibraries.size();
}
public void loadLibrary(String groupId, String artifactId, String version) {
loadLibrary(groupId, artifactId, version, "https://repo1.maven.org/maven2");
}
public void loadLibrary(String groupId, String artifactId, String version, String repoUrl) {
try {
loadLibrary(groupId + ":" + artifactId + ":" + version,
getDependencyFile(groupId, artifactId, version),
getDependencyUrl(groupId, artifactId, version, repoUrl));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
private void loadLibrary(String name, File file, URL url) {
if (!file.exists()) {
try (InputStream in = url.openStream()) {
File temp = new File(file.getParentFile(), file.getName() + ".temp");
Files.copy(in, temp.toPath());
new JarRelocator(temp, file, relocationRules).run();
temp.delete();
// logger.info("Downloaded library " + name);
} catch (IOException e) {
logger.severe("Failed to download library " + name);
e.printStackTrace();
}
}
try {
loaderAccess.addURL(file.toURI().toURL());
loadedLibraries.add(file);
// logger.info("Loaded library " + name);
} catch (Exception e) {
logger.severe("Failed to load library, plugin may not work correctly (" + name + ")");
e.printStackTrace();
}
}
private File getDependencyFile(String groupId, String artifactId, String version) {
return new File(librariesFolder, groupId.replace(".", "-") + "-"
+ artifactId.replace(".", "-") + "-"
+ version.replace(".", "-") + ".jar");
}
private static URL getDependencyUrl(String groupId, String artifactId, String version, String repoUrl) throws MalformedURLException {
String url = repoUrl.endsWith("/") ? repoUrl : repoUrl + "/";
url += groupId.replace(".", "/") + "/";
url += artifactId + "/";
url += version + "/";
url += artifactId + "-" + version + ".jar";
return new URL(url);
}
private static URL getSnapshotDependencyUrl(String groupId, String artifactId, String version, String snapshotVersion, String repoUrl) throws MalformedURLException {
String url = repoUrl.endsWith("/") ? repoUrl : repoUrl + "/";
url += groupId.replace(".", "/") + "/";
url += artifactId + "/";
url += version + "/";
url += artifactId + "-" + snapshotVersion + ".jar";
return new URL(url);
}
}

@ -1,152 +0,0 @@
package lol.pyr.znpcsplus.libraries;
import javax.annotation.Nonnull;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
/**
* Provides access to {@link URLClassLoader}#addURL.
* From https://github.com/lucko/helper/blob/master/helper/src/main/java/me/lucko/helper/maven/URLClassLoaderAccess.java
*/
public abstract class UrlClassLoaderAccess {
/**
* Creates a {@link UrlClassLoaderAccess} for the given class loader.
*
* @param classLoader the class loader
* @return the access object
*/
static UrlClassLoaderAccess create(URLClassLoader classLoader) {
if (Reflection.isSupported()) {
return new Reflection(classLoader);
} else if (Unsafe.isSupported()) {
return new Unsafe(classLoader);
} else {
return Noop.INSTANCE;
}
}
private final URLClassLoader classLoader;
protected UrlClassLoaderAccess(URLClassLoader classLoader) {
this.classLoader = classLoader;
}
/**
* Adds the given URL to the class loader.
*
* @param url the URL to add
*/
public abstract void addURL(@Nonnull URL url);
/**
* Accesses using reflection, not supported on Java 9+.
*/
private static class Reflection extends UrlClassLoaderAccess {
private static final Method ADD_URL_METHOD;
static {
Method addUrlMethod;
try {
addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
addUrlMethod.setAccessible(true);
} catch (Exception e) {
addUrlMethod = null;
}
ADD_URL_METHOD = addUrlMethod;
}
private static boolean isSupported() {
return ADD_URL_METHOD != null;
}
Reflection(URLClassLoader classLoader) {
super(classLoader);
}
@Override
public void addURL(@Nonnull URL url) {
try {
ADD_URL_METHOD.invoke(super.classLoader, url);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
}
/**
* Accesses using sun.misc.Unsafe, supported on Java 9+.
*
* @author Vaishnav Anil (https://github.com/slimjar/slimjar)
*/
private static class Unsafe extends UrlClassLoaderAccess {
private static final sun.misc.Unsafe UNSAFE;
static {
sun.misc.Unsafe unsafe;
try {
Field unsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
unsafe = (sun.misc.Unsafe) unsafeField.get(null);
} catch (Throwable t) {
unsafe = null;
}
UNSAFE = unsafe;
}
private static boolean isSupported() {
return UNSAFE != null;
}
private final Collection<URL> unopenedURLs;
private final Collection<URL> pathURLs;
@SuppressWarnings("unchecked")
Unsafe(URLClassLoader classLoader) {
super(classLoader);
Collection<URL> unopenedURLs;
Collection<URL> pathURLs;
try {
Object ucp = fetchField(URLClassLoader.class, classLoader, "ucp");
unopenedURLs = (Collection<URL>) fetchField(ucp.getClass(), ucp, "unopenedUrls");
pathURLs = (Collection<URL>) fetchField(ucp.getClass(), ucp, "path");
} catch (Throwable e) {
unopenedURLs = null;
pathURLs = null;
}
this.unopenedURLs = unopenedURLs;
this.pathURLs = pathURLs;
}
private static Object fetchField(final Class<?> clazz, final Object object, final String name) throws NoSuchFieldException {
Field field = clazz.getDeclaredField(name);
long offset = UNSAFE.objectFieldOffset(field);
return UNSAFE.getObject(object, offset);
}
@Override
public void addURL(@Nonnull URL url) {
this.unopenedURLs.add(url);
this.pathURLs.add(url);
}
}
private static class Noop extends UrlClassLoaderAccess {
private static final Noop INSTANCE = new Noop();
private Noop() {
super(null);
}
@Override
public void addURL(@Nonnull URL url) {
throw new UnsupportedOperationException();
}
}
}