2013-11-24 43 views
0

在我的項目中,我們有大約20個不同的模塊,打包成獨立的jar文件,每個jar文件都有一些包。這些包中的一些類是公共的,因此在包之外是可見的,即使這些類應該被視爲模塊的私有類。是否有一個註釋處理器來執行模塊可見性規則?

鑑於Java沒有內置的模塊系統,我不想將OSGI引入到我的應用程序中。我正在尋找@Override註釋的一些方面,我可以堅持使用類型來聲明它們對模塊是私有的。然後讓一些註釋處理器執行這些規則。

沿着以下幾行。

@ModuleDefinition 
    public class FooModule{} // empty marker class so it can be referenced by other annotations 

    @ModulePrivate(FooModule.class) 
    public class SomePrivateFooModuleClas{} 

    @ModulePublic(FooModule.class) 
    public class SomePublicFooModuleClass{} 

比方說,下面的代碼位於另一個模塊

@ModuleDefinition 
    public class BarModule{} 

    // the annotation processor should generate an error on the import 
    // statement below because the class being imported is module private 
    // and the class that the import belong to is not in the same module 
    import com.example.SomePrivateFooModuleClass; 

    @ModulePrivate(BarModule.class) 
    public class SomePrivateBarModuleClas{ 
     SomePrivateFooModuleClass foo = ... etc  
    } 

是否有任何開源庫/註解處理器做沿着我已經上文線的東西。

上述這樣的方案是否可以通過註釋處理器實現,或者超出了註釋處理器設計的功能。我不關心模塊的運行時隔離,停止和重新加載模塊,或osgi帶來的任何其他強大功能,我只是希望開發人員不要偶然使用模塊私有類。

回答

0

我實現了類似於你正在尋找的東西。我沒有使用註釋處理器,而是使用ASM來解析類文件。瞧瞧吧http://www.jabsaw.org

我花了一個比你勾勒出一個稍微不同的方法:該模塊也被定義爲空的標誌類,但標註定義哪些類屬於模塊(默認情況下,所有類在同一個包)。另外每個模塊都定義了它導入的模塊。只有來自導入模塊的類纔可以使用。

所以我的方法更傾向於依賴組織。

但是,您可以重複使用解析代碼,無論是複製/粘貼方式還是重構。

如果我理解正確,您的模塊目前由您的罐子代表。使用解析代碼,您可以解析所有jar中的所有類,確定類依賴關係並跟蹤類被解析的jar。

使用不帶參數的@JarPrivate,然後可以檢查是否有任何課程使用另一個jar中的@JarPrivate類。

讓我知道如果你還有興趣,我很樂意爲你做所需的重構。

相關問題