2012-09-27 51 views
1

基本上我有包...可能在Java中執行程序包依賴關係層次結構嗎?

com.me.application 
com.me.application.thing 
com.me.library 

我想執行的規則,沒有什麼com.me.application可以包括com.me.library,除了在com.me.application.thing事情。

在Java代碼時,Maven,類路徑,或Java的任何其他層,這將是大致等價於C連接的水平這是可能的?

回答

2

,我能想到的唯一的辦法就是通過AspectJ

AspectJ是一個方面取向的語言,用來通過單獨的編譯過程,以橫切關注添加到你的應用。 AspectJ的一個經典用途是策略執行,它適合您的場景。

基本上你宣佈,從包裏面的代碼可以被調用,當你遇到一個方法調用(或在您的情況下,變量聲明)違反這些規則拋出編譯錯誤決定的規則。你可以學習的優秀圖書的詳細信息AspectJ in Action

的AspectJ可以很好地集成到一個Maven構建通過AspectJ plugin

而且如果你用AspectJ只執行政策的,你不會有任何額外的運行時依賴,因爲你的字節碼不會被修改。

0

您將需要通過獨立的Maven項目,每建一個jar文件建立com.me.application,com.me.application.thing和com.me.library。 com.me.application的pom不包含com.me.library的依賴項,而com.me.application.thing的pom將包含com.me.library的依賴項。

但這是一個奇怪的包裝結構。你爲什麼要防止這個?

+1

它根本不是一個奇怪的結構,它確保庫的使用在應用程序的一小部分中被隔離,而不是在整個代碼中閃爍。絕對希望有一種解決方案不會深入到物理構建結構中。 – djechlin

+1

我想我覺得它很奇怪,因爲一個是另一個的一個子包。請注意,Maven解決方案只能防止構建時依賴性。如果你的中間有一些scofflaw開發人員,它不會阻止某人在運行時使用反射。 – jalynn2

3

而不是試圖強制編譯器來做到這一點,爲什麼不使用源代碼分析呢?

我會建議使用現在嵌入Sonararchitecture rules engine。將此與build breaker插件相結合,如果開發人員違反了您的層次結構規則,則可能觸發構建失敗。

+0

不知道。太好了! –

相關問題