2013-08-27 116 views
2

我總是使用wsimport工具從WSDL文件生成客戶端類。然後我將它們包含到一個項目的源代碼樹中,並將它們檢入到版本控制系統中。但最近我瞭解到,有一個名爲jaxws-maven-plugin的插件可以生成客戶端類作爲構建步驟(mvn clean jaxws:wsimport)。JAXWS:爲什麼要通過jaxws-maven-plugin在maven中生成客戶端代碼?

雖然我不清楚使用這個插件的真正好處是什麼,除了不需要檢查WS客戶端類到源代碼控制。如果有人想要在項目上工作,他必須檢查代碼,然後運行mvn jaxws:wsimport,然後才能開始工作(否則IDE將顯示錯誤)。那麼真正的好處是什麼?何時應該使用插件而不是將客戶端代碼簽入VCS?

回答

4

可以在構建步驟中自動觸發Maven插件的執行,例如,在編譯該項目之前,在Maven構建週期中專門設置了「生成源代碼」階段。因此,開發人員不必記住手動生成它,使您更接近理想的單擊完整構建。

優點是,您可以從VCS中排除生成的類,因爲它們可以根據需要重新生成。 VCS中生成的代碼的問題在於,WSDL文件中的更改會觸發生成的代碼中的更改(顯然)。但是,當您首先處理合同時,只有WSDL文件中的更改纔是相關的。從VCS中排除生成的代碼將隱藏VCS提交日誌中的冗餘更改。您的VCS存儲庫較小,提交日誌更清晰。

編輯旨在評論: 恕我直言有對場景兩種截然不同的觀點:

1)服務接口的客戶端類的兼容性。

我不確定,如果客戶端類能夠與WS通信,如果它們是從較舊的wsdl生成的。我認爲它可能工作,如果更改僅限於其他方法,並不觸及現有的定義。儘管如此,如果客戶端代碼總是在構建版本上重新生成,這是一個非問題,因爲客戶端代碼自動與wsdl同步。

2)實現與客戶端類的兼容性。

如果生成的客戶端類由於修改的wsdl而發生更改,則可能會破壞使用客戶端類的代碼。但是,如果只有方法添加到wsdl並且現有方法保持原樣,那麼重新生成的客戶端類應該與現有代碼向後兼容。在你的例子中:如果你的代碼只使用A(),並且「新」客戶類現在向A()提供B()另外,你的代碼仍然可以工作。

總之;不包括從VCS生成的客戶端代碼,而是根據需要生成它作爲構建過程的一部分,在我看來,如果WSDL演進向後兼容,應該不會破壞現有的功能代碼。如果WSDL更改不向後兼容,則編譯時會發生錯誤。但這些都是不可避免的 - 使用來自VCS的過時客戶端類可能會實際上隱藏這些錯誤,直到您嘗試執行該應用程序。

+0

因此,讓我們說一個wsdl定義了一個我想使用的方法A()。我生成客戶端類,開發代碼,然後將所有內容簽入VCS。與此同時,wsdl發生了變化,並且添加了一個新的方法B()。然後我將不得不生成一個新的客戶端類並檢查它們,否則代碼將不起作用,即使我只使用A()? – Janek

相關問題