Load plugins from jar file

This commit is contained in:
huangyuhui
2017-02-17 20:00:45 +08:00
parent 413854d1f1
commit 5f65496500
19 changed files with 139 additions and 110 deletions

View File

@@ -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();
}
}
}
}