基本上我有包...可能在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連接的水平這是可能的?
基本上我有包...可能在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連接的水平這是可能的?
,我能想到的唯一的辦法就是通過AspectJ。
AspectJ是一個方面取向的語言,用來通過單獨的編譯過程,以橫切關注添加到你的應用。 AspectJ的一個經典用途是策略執行,它適合您的場景。
基本上你宣佈,從包裏面的代碼可以被調用,當你遇到一個方法調用(或在您的情況下,變量聲明)違反這些規則拋出編譯錯誤決定的規則。你可以學習的優秀圖書的詳細信息AspectJ in Action
的AspectJ可以很好地集成到一個Maven構建通過AspectJ plugin
而且如果你用AspectJ只執行政策的,你不會有任何額外的運行時依賴,因爲你的字節碼不會被修改。
您將需要通過獨立的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的依賴項。
但這是一個奇怪的包裝結構。你爲什麼要防止這個?
而不是試圖強制編譯器來做到這一點,爲什麼不使用源代碼分析呢?
我會建議使用現在嵌入Sonar的architecture rules engine。將此與build breaker插件相結合,如果開發人員違反了您的層次結構規則,則可能觸發構建失敗。
不知道。太好了! –
您可以使用Checkstyle的import control規則執行檢查。將Maven Checkstyle plugin配置到您的pom.xml中,並且可以設置任何違規,導致構建失敗。
它根本不是一個奇怪的結構,它確保庫的使用在應用程序的一小部分中被隔離,而不是在整個代碼中閃爍。絕對希望有一種解決方案不會深入到物理構建結構中。 – djechlin
我想我覺得它很奇怪,因爲一個是另一個的一個子包。請注意,Maven解決方案只能防止構建時依賴性。如果你的中間有一些scofflaw開發人員,它不會阻止某人在運行時使用反射。 – jalynn2