我需要开发一种模块,它将作为 JAR 提供,使 2 个产品兼容。假设我有一个名为 ProductSource 的产品和另一个名为 ProductDep 的产品。ProductSource 是完全独立的,ProductDep 调用几个方法/类,甚至从 ProductSource 继承一些类。ProductSource (PS) 和 ProductDep (PD) 一样有多个版本。例如,假设一个客户端使用 PD_v3 和 PS_v3,而另一个客户端使用 PD_V1 和 PS_V3。我们的开发有点讨厌,我们无法更改任何版本,我们只能提供一个将在这些之上加载的 jar。问题是,我们开发的 PS_v3 仅考虑了 PD_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){....}
}
}
我的问题是抽象类......或者如果你有更好的解决方案。现在我正在插入我的兼容性文件夹,该文件夹将包含以前版本使用的所有类以及自新版本以来已删除的所有方法(是的,我的团队不知道注释已弃用 TT)或任何更改甚至更改的方法签名班级搬家了。