は非常に単純な例である:あなたがインターフェイスのサービスを定義するためのメインアプリケーションのJAR、必要があります。
package multiverse;
public interface Service {
public String getDescription();
}
を、メインクラスが二つに瓶からのサービスのインスタンスを作成します異なるディレクトリ:
:
package multiverse;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main {
private static final Logger LOG = Logger.getLogger(Main.class.getName());
private static final File DIR1
= new File("../multiverse-v1/dist");
private static final File DIR2
= new File("../multiverse-v2/dist");
public static void main(String[] args) {
Service service1 = loadService(DIR1);
Service service2 = loadService(DIR2);
System.out.println(service1.getDescription());
System.out.println(service2.getDescription());
}
private static Service loadService(File dir) {
try {
File[] jars = dir.listFiles((File file) -> file.isFile()
&& file.getName().toLowerCase().endsWith(".jar"));
URL[] urls = new URL[jars.length];
for (int i = 0; i < jars.length; ++i) {
urls[i] = jars[i].toURI().toURL();
}
ClassLoader cl = new URLClassLoader(urls);
Class<? extends Service> clazz
= (Class<? extends Service>) cl.loadClass(
"multiverse.ServiceImpl");
return clazz.newInstance();
} catch (MalformedURLException | ClassNotFoundException
| InstantiationException | IllegalAccessException ex) {
LOG.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex.getMessage());
}
}
}
は今、私は2つの異なる瓶、上記のプログラムによって使用される各ディレクトリ内の1つの中で、サービスの2つの実装を持っています
と
package multiverse;
public class ServiceImpl implements Service {
@Override
public String getDescription() {
return "Service V2";
}
}
彼らは、コンパイルされたとき、彼らはサービスのインターフェイスへのアクセスを持たなければならないことに注意してください。このインタフェースは、メインプログラムと同じjarファイルでも、別のjarファイルでもかまいません。メインプログラムは、各実装に使用されるjarのクラスに直接アクセスすることはできません。常にインターフェイスを経由する必要があります。
はい:2つのClassLoaderを使用 –
@MauricePerryどのように?いかなる例も有用であろう。 – Trismegistos