plugin-api project
Hello.java
package myproject.api;
public interface Hello {
public String getMessage();
}
Export this class as a JAR, e.g. plugin-api.jarhello-impl project
HelloImpl.java
package myproject.api.impl;
import myproject.api.Hello;
public class HelloImpl implements Hello {
@Override
public String getMessage() {
return "Hello World";
}
}
Make sure the plugin-api.jar is in the hello-impl project classpath. Export the JAR as hello-impl.jar to main-project/plugins (see below).bye-impl project
ByeImpl.java
package myproject.api.impl;
import myproject.api.Hello;
public class ByeImpl implements Hello {
@Override
public String getMessage() {
return "Bye World";
}
}
Make sure the plugin-api.jar is in the bye-impl project classpath. Export the JAR as bye-impl.jar to main-project/plugins (see below).main project
Main.java
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import myproject.api.Hello;
public class Main {
public static void main(String[] args) throws Exception {
for (File file : new File("plugins").listFiles()) {
URLClassLoader ucl = new URLClassLoader(new URL[] {file.toURI().toURL()},
Main.class.getClassLoader());
Enumeration<JarEntry> jarEntries = new JarFile(file).entries();
while (jarEntries.hasMoreElements()) {
JarEntry jarEntry = jarEntries.nextElement();
if (jarEntry.getName().endsWith(".class")) {
String className = jarEntry.getName().replace("/",
".").substring(0,
jarEntry.getName().indexOf(".class"));
Class c = Class.forName(className, true, ucl);
for (Class i : c.getInterfaces()) {
if ("myproject.api.Hello".equals(i.getName())) {
Hello hello = (Hello) c.newInstance();
System.out.println(hello.getMessage());
}
}
}
}
}
}
}
Make sure the plugin-api.jar is in the main project classpath. And create plugins directory and drop all the two implementation JARs into the plugins directory, such as belowmain/plugins/hello-impl.jar
bye-impl.jar
No comments:
Post a Comment