以下のような構造のアーカイブ・ファイルを考えます。
/ +---classes/ | +---クラス・ファイル +---lib/ +---jarファイル
以下の要件のサーバ・クラスを書くことを考えます。
package example; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import jp.sourceforge.deployer.Deployer; import jp.sourceforge.deployer.DeployerClassLoader; import jp.sourceforge.deployer.DeployerListener; public class ExampleServer implements DeployerListener { private static Deployer deployer; private Map<String, DeployerClassLoader> appMap = new HashMap<String, DeployerClassLoader>(); public static void main(String[] args) throws Exception { File deployDir = new File("./deploy"); Pattern filePattern = Pattern.compile(".*\\.jar"); File workDir = new File("./work"); deployer = new Deployer(deployDir, filePattern, workDir); deployer.addListener(new ExampleServer()); while (true) { deployer.monitor(); Thread.sleep(1000); } } public void deployEnd(Deployer deployer, File file, File destDirectory) { try { System.out.println("deployEnd: " + file.getAbsolutePath()); File[] fileDirectories = new File[] { new File(destDirectory, "classes") }; File[] jarDirectories = new File[] { new File(destDirectory, "lib") }; final DeployerClassLoader cl = new DeployerClassLoader(fileDirectories, jarDirectories); this.appMap.put(file.getAbsolutePath(), cl); Runnable r = new Runnable() { public void run() { try { Class clazz = cl.loadClass("Main"); Object obj = clazz.newInstance(); clazz.getMethod("execute").invoke(obj); } catch (Exception e) { e.printStackTrace(); } } }; Thread t = new Thread(r); t.start(); } catch (Throwable t) { t.printStackTrace(); } } public void deployFile(Deployer deployer, File file, File destDirectory, File deployFile) { System.out.println("deployFile: " + deployFile.getAbsolutePath()); } public void deployStart(Deployer deployer, File file) { System.out.println("deployStart: " + file.getAbsolutePath()); } public void undeployEnd(Deployer deployer, File file) { System.out.println("undeployEnd: " + file.getAbsolutePath()); DeployerClassLoader cl = this.appMap.get(file.getAbsolutePath()); cl.dispose(); } public void undeployStart(Deployer deployer, File file, File destDirectory) { System.out.println("undeployStart: " + file.getAbsolutePath()); } }