2 つの製品に互換性を持たせる JAR として提供される一種のモジュールを開発する必要があります。ProductSource という製品と、ProductDep という別の製品があるとします。ProductSource は完全に独立しており、ProductDep はいくつかのメソッド/クラスを呼び出し、さらに ProductSource から一部のクラスを継承します。ProductSource (PS) には、ProductDep (PD) と同様にいくつかのバージョンがあります。たとえば、あるクライアントが PD_v3 と PS_v3 を使用し、別のクライアントが PD_V1 と PS_V3 を使用するとします。私たちの開発はどういうわけか厄介で、バージョンを変更することはできません。これらの上にロードされるjarのみを提供できます。問題は、PD_v3 の結果のみを考慮して PS_v3 を開発し、PS_v2 を PD_v2 で、PS_v1 を PD_v1 で開発したことです。そして、一部のクライアントが PS_vY を PD_vX および X!=Y と共に使用していると考えるようになったのは、つい最近のことです。
私が解決する必要がある最悪のケースは次のとおりです。
PS_v3 クラス MyClassA :
package com.package.a;
import com.package.xxx.AClass;
[...]
/**
* MyClassA Version 3
*/
public class MyClassA extends AClass
{
public AType1 method1(AType2 arg1, AType3 arg2){ return null; //or whatever}
public void method2(AType1 arg1){}
}
public abstract class AClass
{
public abstract AType1 method1(AType2 arg1, AType3 arg2);
public abstract void method2(AType1 arg1);
}
そして、私の PD_v2 はこのクラスを使用しますが、次のような同じクラスを持つ PS_v2 で開発されました。
package com.some.other.package.a;
import com.some.other.package.xxx.AClass;
[...]
/**
* MyClassA version 2
*/
public class MyClassA extends AClass
{
public AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3){ return null; //or whatever}
public abstract AType1 method2(){}
}
public abstract class AClass
{
public abstract AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3);
public abstract AType1 method2();
}
したがって、私の PD_V2 が私の PD_V3 クラスを使用したい場合、実行時の問題が発生します。
例 :
import com.some.other.package.xxx.AClass; //error on this one because he cannot find the package
public class MyClassImpl extends AClass
{
public AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3){ return null; //or whatever}
public abstract AType1 method2(){}
}
しかし、彼は V3 パッケージ def を使用しているため、com.package.a.AClass が見つからないため、すべてのバージョンを探して、メソッドの可能なすべてのシグネチャを含む jar を提供することを考えました。
だから私の考えは、このようなものを提供することでした:
package com.some.other.package.a;
import com.some.other.package.xxx.AClass;
[...]
/**
* MyClassA version 2
*/
public class MyClassA extends AClass
{
public AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3){
try{
//we try to load our latest version
//no need to search for the class version in this package it will be loaded automatically if it exists
Class<?> clazz = Class.forName("com.package.a.MyClassA");
clazz.getConstructor(......)
etc....
} catch(ClassNotFoundException e){....}
}
}
私の問題は抽象クラスにあります...または、より良い解決策があれば。現在、以前のバージョンで使用されていたすべてのクラスと、新しいバージョン以降に削除されたすべてのメソッドが含まれる互換性フォルダーをプラグインしています (ええ、私のチームはアノテーション Deprecated TT を知りません)、または変更されたメソッド署名またはクラスが移動しました。