2017-10-10 24 views
0

2つの異なるアプリケーションに1つのアプリケーションを接続する必要があります。最初のアプリケーションはバージョン1のプロトコルPを使用しています。バージョン2では同じプロトコルを使用しています。ライブラリは互換性がないため、私は両方のアプリケーションで使用する必要があります。問題は、彼らが同じパッケージを使用しているということです。 com.company.Pとアーキテクチャ(クラス名、パッケージ)は同じです。1つのアプリケーションで同じパッケージ名の同じlibaryの2つのバージョン

両方を同じアプリで使用することはできますか?ここで

+0

はい:2つのClassLoaderを使用 –

+0

@MauricePerryどのように?いかなる例も有用であろう。 – Trismegistos

答えて

1

は非常に単純な例である:あなたがインターフェイスのサービスを定義するためのメインアプリケーションの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のクラスに直接アクセスすることはできません。常にインターフェイスを経由する必要があります。

+0

残念なことに私の場合は、私はインターフェイスを持っていないということです。私は2つの異なるジャーで同じ修飾名を持つ2つのクラスを持っています。 – Trismegistos

+0

@Trismegistos OK、インタフェース –

+0

を書いてください。それらのライブラリは私によって提供されていないので、私はできません。 – Trismegistos

関連する問題