2012-12-05 33 views
2

我在該項目中有更多的類,但現在請考慮只有A,B和C類。如何使用Eclipse從相同的代碼自動構建不同的JAR?

abstract public class A {...} 

public class B extends A {...} 

public class C extends A {...} 

再後來我有一個代碼,說,在d類,像這樣

A a = new B(); 
//A a = new C(); 

//use a's methods 

所以現在我的問題是如何輕鬆地在兩個獨立的JAR文件的Eclipse構建配置。首先應該有B.class納入和排除C.class和代碼爲A a = new B();第二個應該有C.class包括和B.class排除和代碼A a = new C();

我不知道Ant和Maven很多東西。在這種情況下我需要使用它們嗎?

也許,我的設計有問題,如果是這樣,請讓我知道。

+0

我會說你需要一個「螞蟻」任務。 – SJuan76

+0

@ SJuan76,代碼'A a = new B/C();'? –

+0

我確實忽略了這一點。我會說你應該使用CDI,但這意味着你的程序發生了變化。 – SJuan76

回答

2

你想要什麼,主要是一個代碼加載問題,而不是一個Ant的問題。

只要你提出了創建一個新的類實例的兩個語句:

A a = new B(); 
A a = new C(); 

的構造器是使用靜態代碼調用。 Ant不能更改代碼,因此Ant看到的唯一方法是生成一個Factory類,其中包含Ant作爲構建過程的一部分,具體取決於是否將AC包含在JAR中

但是,這會導致項目由於Eclipse項目中的原始源代碼未能使用因子類,因此無法再直接在Eclipse中使用它。

恕我直言,更好的方法是動態類加載(可能與反射相結合)。您可以自動搜索擴展爲A的類,或者向JAR添加配置文件/信息,以指定要創建哪個類(例如屬性文件)。 將屬性文件與Java文件放在src文件夾中並通過this.getClass().getResource("myclass.config");

加載它該配置文件可以包含應該用於創建新實例的類名稱。 剪斷下面的代碼假定BC都有一個公共構造不帶任何參數:

String classNameToLoad = ... // loaded from config file example "mypackage.B" 
final Class<?> c = Class.forName(classNameToLoad); 
final Class<? extends A> ac = c.asSubclass(A.class); 
final Constructor<? extends A> a_ctor = ac.getConstructor(); 
final A a = a_ctor.newInstance(); 
+0

如果我遵循動態類加載的方法,是否可以對Eclipse和Jar使用相同的代碼? –

+0

是的,因爲代碼本身根據配置文件決定加載它的哪個類也可以在Eclipse中使用。只有MANIFEST.MF中的配置不會工作,因爲類文件不在JAR文件中。另見我更新的答案。 – Robert

+0

我在動態類加載和反射方面很差。你能否用更多的代碼或說明或相關材料來詳細解釋答案,所以我會接受你的答案,因爲它是迄今爲止最好的答案。謝謝 –

1

在你的eclipse中,如果你右鍵點擊你的項目,你將會有一個選項Export 點擊它,選擇jar,然後命名jar,選擇你想要的類。 對另一個罐子重複此操作。

檢查這個http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-33.htm

+0

我想自動做。我在那裏使用Export - Executable Jar,沒有類的選擇。 –

+0

你有沒有看到你的項目,打開包裝,通過在左側選擇一個'+',然後去你的構建路徑,並選擇你的類 –

+0

請檢查參考的步驟 –

0

這樣做將有3個獨立的Java項目Eclipse中的最簡單的方法。根據你的榜樣,那將是

  • B碼項目
  • C代碼項目
  • 通用代碼

Eclipse允許您從您的項目中引用其他項目的bin目錄構建路徑。

然後,您可以導出(或使用Ant)B和C項目作爲單獨的項目。

相關問題