Load plugins from jar file
This commit is contained in:
@@ -17,8 +17,15 @@
|
||||
*/
|
||||
package org.jackhuang.hmcl.api;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import org.jackhuang.hmcl.api.ui.AddTabCallback;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import javax.swing.JFrame;
|
||||
import org.jackhuang.hmcl.api.auth.IAuthenticator;
|
||||
import org.jackhuang.hmcl.api.func.Consumer;
|
||||
@@ -30,6 +37,7 @@ import org.jackhuang.hmcl.api.func.Consumer;
|
||||
*/
|
||||
public class PluginManager {
|
||||
|
||||
private static final File PLUGINS_FILE = new File("plugins/");
|
||||
private static final ArrayList<IPlugin> PLUGINS = new ArrayList<>();
|
||||
|
||||
public static void getPlugin(Class<?> cls) {
|
||||
@@ -52,4 +60,35 @@ public class PluginManager {
|
||||
p.onAddTab(frame, callback);
|
||||
}
|
||||
|
||||
public static void loadPlugins() {
|
||||
ArrayList<URL> urls = new ArrayList<>();
|
||||
ArrayList<JarFile> jars = new ArrayList<>();
|
||||
if (PLUGINS_FILE.isDirectory()) {
|
||||
for (File f : PLUGINS_FILE.listFiles(f -> f.isFile() && f.getName().endsWith(".jar")))
|
||||
try {
|
||||
jars.add(new JarFile(f));
|
||||
urls.add(f.toURI().toURL());
|
||||
} catch (IOException e) {
|
||||
System.err.println("A malformed jar file: " + f);
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
URLClassLoader classLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]));
|
||||
for (JarFile f : jars)
|
||||
for (Enumeration<JarEntry> entries = f.entries(); entries.hasMoreElements();)
|
||||
try {
|
||||
JarEntry entry = entries.nextElement();
|
||||
String clsName = entry.getName();
|
||||
if (clsName.endsWith(".class") && !clsName.contains("$")) {
|
||||
clsName = clsName.replace('/', '.').replace(".class", "");
|
||||
Class clazz = classLoader.loadClass(clsName);
|
||||
if (IPlugin.class.isAssignableFrom(clazz))
|
||||
getPlugin(clazz);
|
||||
}
|
||||
} catch (ClassNotFoundException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user