处理jar包结构的变化

时间:2012-01-31 18:35:52

标签: java import jacorb

我有点陷入困境,我正在寻求一些如何解决它的帮助。我有一些源代码可以从idls创建的jar文件中导入各种类。现在我已经获得了这个idl jar的新版本,它有一个不同的包结构,它打破了我所有旧的import语句。我无法修改import语句所以我试图看看是否有解决方法。有什么想法吗?

基本上我被要求使当前源代码适用于jar的新版本和旧版本,最好不要修改代码。我不认为这是可能的,但我希望我错了。

3 个答案:

答案 0 :(得分:1)

这是你可以做的一件事:重新创建所有旧类并使它们与新类匹配。例如,如果您有a.Foo,现在是b.foo,则可以:

package a;
public class Foo {
    b.Foo foo;
    public void method() {
        foo.method();
    }
}

package b;
public class Foo {
    public void method() {
        // Your new code...
    }
}

这有点痛苦,但我担心这是向后兼容的代价。

如果类结构允许,另一个解决方案是a.Foo继承b.foo,因此您不必创建所有委托方法。但取决于你的项目可能不起作用。

希望这有帮助。

答案 1 :(得分:1)

没有办法做到这一点。但是如果你想要批量更改包名,可以使用命令sed of linux。

例如,如果您的旧软件包是com.patito,并且您想将其更改为org.duck,则可以执行以下操作:

 sed 's/com.patito/org.duck/g' *.java

答案 2 :(得分:0)

这完全取决于结构变化的严重程度。如果新类(不同的功能)已经替换了旧类但保持了相同的名称,那么你就会非常敬酒。如果新类只有新名称/ pkgs,那么您可以为所有原始导入创建一个包装器。

例如,如果原始类是:

package my.package;
public class OldClassName{
  public void getSomeData(){}
}

但它现在已改为:

package my.new.package;
public class NewClassName{
  public void getSomeData(){}
}

您可以创建原始类的包装器:

package my.package;
import my.new.package;
public class OldClassName extends NewClassName{
}

注意事项:

  1. 如果你有很多课程,这是一种皇室痛苦
  2. 您将被限制在非最终的课程中。如果任何原始进口是最终类,那么你就是干杯,你能做的最好的就是作曲(这意味着更多的工作)和大量的授权。
  3. 如果你有很多课程,你总是可以自己写一个小工具来为你生成包装...

    完成后,您应该能够将新的包装器jar放在新的lib旁边,并且应该工作。