2012-01-31 77 views
0

我處於一種困境,我正在尋找一些關於如何解決它的幫助。我有一些從idls創建的jar文件中導入各種類的源代碼。現在我得到了這個idl jar的新版本,它具有不同的包結構,它打破了我所有的舊導入語句。我無法修改導入語句,因此我試圖查看是否有解決方法。有任何想法嗎?處理jar包的結構變化

基本上我被要求使當前的源代碼與jar的新版本和舊版本一起工作,最好不用修改代碼。我不認爲這是可能的,但我希望我錯了。

+2

呃,沒有。如果軟件包已更改...您的導入必須更改並重新編譯您的代碼。 – 2012-01-31 18:39:02

+0

我希望有一種方法可以修改導入以使用可以像環境變量一樣更改的靜態字符串。 – Dodd10x 2012-01-31 18:59:12

回答

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,所以你不必創建所有的委託方法。但取決於你的項目可能無法正常工作。

希望這會有所幫助。

+0

這也是我的第一個想法,但既然有這麼多,我不得不創造我希望別的東西。我知道這是一個長鏡頭,但我必須嘗試。 – Dodd10x 2012-01-31 18:55:30

1

不,沒有辦法做到這一點。但是,如果您想批量更改軟件包名稱,則可以使用linux的命令sed。

例如,如果你的老包是com.patito,你想改變它org.duck你可以這樣做:

sed 's/com.patito/org.duck/g' *.java 
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. 你將被限制在不是最終的課程。如果有任何原始的進口是最終的課程,那麼您就會敬酒,而您所能做的最好的就是組合(意味着更多的工作)以及大量的授權。

如果你有很多的課,你總是可以編寫自己的小工具爲您生成的包裝...

一旦這樣做,你應該能夠放下你的新的包裝罐子旁邊的新的lib和東西應該工作。