簡體   English   中英

將同一個包中的類構建到單獨的jar中

[英]Build classes in same package into separate jars

我有一個服務器應用程序和兩個基於Swing的客戶端應用程序。 我們正在eclipse中開發它們,每個都有一個單獨的項目。

許多課程都是共享的。 例如, my.server包有一些用於服務器和客戶端的類,而其他包僅用於服務器。 雖然我更喜歡將它們放在同一個包中,因為它們密切相關,而且其中一些依賴於包的可見性,我不想分發應用程序不需要的類,因為它不僅會使文件大小變大,而且還會這將是一個安全風險。

目前,每個服務器和客戶端都有相同的罐子,這是一團糟。 理想情況下,我想基於依賴關系自動創建jar,如下所示。

服務器:

  • server.jar:僅供Server使用的類
  • server-client1-common.jar:服務器和客戶端1共享的類
  • server-client2-common.jar:服務器和客戶端2共享的類

客戶1:

  • client1.jar:僅客戶端1使用的類
  • server-client1-common.jar:服務器和客戶端1共享的類
  • client-common.jar:客戶端1和客戶端2共享的類,但不是服務器

客戶2:

  • client2.jar:僅客戶端2使用的類
  • server-client2-common.jar:服務器和客戶端2共享的類
  • client-common.jar:客戶端1和客戶端2共享的類,但不是服務器

我意識到你可以使用ant手動完成這項工作,但這將是一次維護災難。 是否有一個工具可以自動處理這種依賴?

“維修災難”是什么意思? 如果您創建一個ANT腳本,只需運行它,它將為您編譯和打包罐子。

作為一個更強大的替代方案,您可以使用maven。 對於更輕量級的東西,內置的eclipse導出工具可能會起作用。

我不能為您提供隨時可用的解決方案。 這里有一個想法:創建一個注釋或一組注釋,如下所示:

@jarselector(types='server')
class ServerOnly {
   ...
}

@jarselector(types='server,client1')
class ServerAndClient {
   ...
}

然后通過擴展jar任務(或maven插件)或編寫自己的任務來創建自己的ant任務,該任務接受此注釋並根據注釋打包類,然后將其用作過濾器。

你只需要創建一次任務 - 我過去已經完成了它,它沒有聽起來那么復雜,問題聽起來足夠大,值得努力。

之后,您必須對所有類進行一次注釋(或者根據您的實現只需要客戶端需要的那些類,或者只有那些不被每個jar共享的類等)。 看到課程的人可以立即看到它的用途。 創建新類時,您可以輕松添加注釋。

我真的不認為有一個現成的ant任務或maven插件可以做到這一點。

或者 - 如果您真的無法更改包結構 - 您還可以使用多個源目錄來保存包,但將文件拆分到不同的目錄中。 Eclipse不關心您使用多少源目錄。 然后,您需要為源目錄調整一次構建工具,然后可以對文件進行排序。

為您要創建的每個JAR創建一個單獨的Eclipse項目。 然后在每個頂級項目的Build Path的“Projects”選項卡上設置依賴項。 因此,“服務器”項目將“server-client1-common”和“server-client2-common”列為必需項目。 等等。

我見過這個模型被許多不同的組織使用,我一直認為這是“行業接受”的方式。 它只是工作!

有關構建應用程序的最佳實踐之一是每個項目都有一個jar。
例如,Maven使用它作為默認值。 你可以欺騙它做其他事情,但最好加入他們而不是“打”他們。

http://maven.apache.org/guides/mini/guide-using-one-source-directory.html
http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

因此,在您的情況下,您應該創建6個項目:Server,Client1,Client2,ServerClient1Common,ServerClient2Common,ClientCommon

為了選擇所需的類,我不認為有一個工具,可能你應該更清楚地知道什么是常用功能。 創建Common項目,並將它們添加到構建路徑 - 依賴項。 然后開始將類移動到Common項目中,將它們放在同一個包中。

例如,創建ServerClient1Common項目。
對於Client1,請轉到配置構建路徑 - >項目。 添加ServerClient1Common。 刪除對Server Project的所有引用。
對於Server,請轉到配置構建路徑 - >項目。 添加ServerClient1Common。 刪除對Client1項目的所有引用。

您現在應該有很多缺少的類/導入。 嘗試逐一解決它們。

最后,您應該能夠編譯3個項目並獲得您提到的罐子。

PS:其他策略(比如一個具有不同構建目標的超級項目,或者與纏繞的螞蟻/專家構建者進行的3個項目)更加混亂。 可能有一個例外 - 另一種分割類的方法,但我不知道它是否適用於你:client1.jar,client1-interface.jar,client2.jar,client2-interface.jar,server.jar,server- interface.jar。 這樣你就可以使用3個項目,每個項目都有兩個目標罐子。 要運行client2.jar,您需要server-interface.jar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM