2009-02-26 160 views
3

處理生成的代碼有什麼好策略?我們的一個項目使用Apache CXF的wsdl2java工具爲一組wsdls生成JAX-WS存根。這個代碼應該如何處理?你如何處理生成的代碼?

有兩種選擇,我可以看到:

  1. 一旦生成stub並將其存儲在版本控制。有了這個,你不必處理IDE類路徑問題,因爲你的樹中(或附近)有源文件。然而,除了誘惑人們使用生成的代碼進行猴子游戲之外,你在版本控制中還有很多額外的混亂因素。

  2. 存根在每次生成時都會生成。這顛倒了#1的優點/缺點,因爲開發人員現在必須處理運行構建腳本並將生成的jar添加到他/她的類路徑中。

我們去了#2,因爲類路徑相關問題的煩惱似乎超過了#1中詳述的問題。

其他人在做什麼?有沒有人有任何建議來簡化這個過程?

回答

8

我的態度是生成的代碼實際上不應該存儲在版本控制中。必須有令人信服的理由才能做到這一點。我通常創建一個ant任務「build-for-eclipse」來構建所有生成的代碼。我運行它,刷新生成代碼所創建的目錄,並且,我很適合去。

的目標是,你有一個「一鍵式」簡單的任務,任何開發人員可以這樣做,他們將有所有的源 - 產生的,而不是 - 在他們的IDE,但任何事情沒有輸出存儲在源代碼管理中。如果是發電機的輸出,則根據定義,它不是來源。 :-)

這應該安全地滿足每個人的需求。

0

我想你會發現J2EE/EJB 2.x人羣不得不處理與XDoclet類似的問題。根據我的經驗,我已經看到這兩種方式 - 人們將生成的代碼存儲在版本控制中,在構建過程中生成代碼。

只要你有一個很好的測試系統,我認爲#1是最好的。如果你有非常好的可以處理樣式2的工具(比如Eclipse的Xdoclet功能),那就去做吧。不過要注意 - 如果長時間構建和重新構建並且重新啓動IDE/JVM通常是一件痛苦的事情,#2通常可以填充永久生成的JVM。

+0

XDoclet是如何解決這個問題的? – Kevin 2009-02-26 00:33:41

+0

每次對輸入文件進行更改時都會運行的工具。 – Martin 2009-02-26 06:01:25

+0

(或者你可以用手運行它:) – Martin 2009-02-26 06:02:17

2

我試過這兩種方式,並決定不存儲生成的代碼作爲一般規則。當存在輕微的微小差異時,這可能會成爲一個問題,而且看起來版本控制方面有所改變,而且確實沒有什麼重要的。此外,#1,你可以最終在你的倉庫中放置很多垃圾,特別是在生成的代碼是二進制的情況下。大多數回購不會存儲二進制代碼的差異,而是完整的副本。

即使在像你這樣的情況下,生成的東西是文本,我傾向於不存儲它,除非我絕對必須更改代碼才能使其工作。

2

我更喜歡選項#3,它具有1 & 2的優點,但不是缺點:永遠不會將生成的文件提交到源代碼控制中,而是創建一個完全自動化的可移植構建過程(一個shell命令將其全部運行每個工作站)。

關於這兩方面的SO(和「網絡」)其他地方都有很多討論。可以這麼說:源代碼控制用於SOURCE,不是生成代碼或二進制文件,並且這種源代碼包含可自動執行可重複構建的腳本。

您的真正問題取決於基於IDE的構建過程,這將不可避免地傷害到您。讓開發人員配置他們的IDE進行構建,但不要讓它在場上下注,也不要讓它進入源代碼管理系統。

祝福。

0

2號天更好。同樣#2,你可以利用代碼生成器(你的情況下的Apache CXF)的改進。每次開始使用新的CXF版本時,您不必重新生成並簽入。 是的,有一個單擊構建系統,它可以完成一切:-)

0

我們使用Eclipse作爲主IDE /工具。我們爲每個生成的代碼定義新的Java項目。例如,如果我正在使用hibernate和Axis Web Services在Web項目中工作。我們在我們的工作空間中有這樣的結構:

projectWeb:這是主要的項目,通常是一個動態的web項目。所有的編碼員都在這裏工作:-)

projectORM:使用hibernate工具生成的代碼。

projectWS:使用Java2WDSL生成的代碼。

projectWSClient:使用WDSL2Java生成的代碼。

每個項目都在修訂控制(SVN)下。我們使用Maven 2作爲depencendy/build工具,並將生成代碼中的二進制文件保存爲我們的Maven 2存儲庫中的jar文件。在此之前,團隊中的一個人(或多個)負責處理生成的代碼並在每代之後對其進行測試(例如,模型發生更改時)。

Regards

0

大多數情況下,我會選擇#2。原因很明顯,我看到已經有足夠的人支持這種選擇。

我的書中有一個例外。如果大多數/所有的下列規定:
(如,「大多是」,你知道 - 這是一個思維的標準,不是寫在石頭上...)

  1. 存根代碼需要長時間重新生成(*)
  2. 沒有有效的方法來預先確定源是否有變化(a-la MAKE),所以您必須每次重建存根。
  3. 存根碼有望很少改變(因爲從其中短截線產生的變化很少源)
  4. 任何更改在存根碼通常需要在程序的其餘部分反正
手動更改

我通常會用腳本編寫生成步驟(並記錄源代碼管理中的那些步驟),但只能手動執行代理生成。

以上的典型示例是數據庫ORM類和Web服務代理類。 (多長時間「太長」?這取決於;在高度互動的環境中,一分鐘可能會「太長」,正如我所說,這是一個需要考慮的標準,在真正的編程中,在現實生活中,你必須選擇你的罪惡)*

相關問題