我想能夠在Java中註釋一個公共類/接口@NonPublic
,這將意味着此接口僅用於此項目中,它是而不是這個項目導出的公共API的一部分。如何限制在其Jar之外使用Java公共類?
這對於由幾個jar文件組成的項目很常見。並非所有的public
類/接口都是真正在你的jar之外公開的。
你知道這樣做的任何工具/框架/插件嗎?
我想能夠在Java中註釋一個公共類/接口@NonPublic
,這將意味着此接口僅用於此項目中,它是而不是這個項目導出的公共API的一部分。如何限制在其Jar之外使用Java公共類?
這對於由幾個jar文件組成的項目很常見。並非所有的public
類/接口都是真正在你的jar之外公開的。
你知道這樣做的任何工具/框架/插件嗎?
恕我直言,Java中的包系統是存在的最破碎的東西之一。
我不熟悉任何標準的Java級別的機制,儘管可能很容易編寫一個工具或編譯器擴展來強制執行它。但是,如果你使用的是OSGi(Eclipse就是這樣寫的),它的優點之一就是用於指定更好的包和模塊級別限制的系統。
如果沒有OSGi,另一個常見做法是將API與實施分開。
您可以將編譯期間所需的類從運行時所需的類中分離出來。阻止庫的用戶依賴於實現細節。
myLibAPI.jar
myLibImpl.jar
這是一個非常好的設計實踐,感謝提示! – espinchi 2010-07-19 13:00:03
OSGi Bundle是解決方案。
如果要將Jar轉換爲Eclipse插件,可以使用Eclipse RCP版本。右鍵單擊您的項目:配置 - >轉換爲插件項目
這是OSGi所做的,雖然我懷疑這是超出了你所追求的範圍。 – skaffman 2010-07-16 14:23:39
你能否提供更多細節?這是用於過濾類還是用於強制編程使用類/接口的方式?對於第二種方法,看到你想要一個Eclipse插件可能沒有用,但SecurityManager可以讓人看到來自哪裏的一個調用。 – 2010-07-16 14:51:05
OSGi比我所要求的要多,但肯定能解決它。 OSGi-ing我們的基礎設施不是太難,但不是微不足道的 – espinchi 2010-07-19 12:58:43