2009-02-15 30 views
10

我編寫Eclipse插件並將一些類作爲API導出,同時希望限制對其他類的訪問。控制對「.internal」包的訪問的最佳實踐

我遵循常見的Eclipse實踐將這些類分離爲「.internal」子包。

但是,我不能在這些類上使用「包」或默認級別的訪問權限,因爲它們中的很多需要被我導出的類使用。

阻止或阻止我的API用戶使用這些類用於他們自己的目的的最佳做法是什麼?是否有自動檢查器?

我承認,我在使用一些Eclipse的內部類的已經涉足的時候,我別無選擇:)

澄清:我有一個非插件代碼同樣需要。

回答

7

是不是隻是將META-INF/MANIFEST.MF更新爲插件osgi項目(如果它不是已經?)的情況。它應該看起來像這樣:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: My-plugin 
Bundle-SymbolicName: com.mycompany.mypluginname 
Bundle-Version: 1.0.0 
Bundle-Vendor: MyCompany 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Service-Component: 
Import-Package: org.apache.log4j;version="1.2.14" (, separated etc) 
Export-Package: com.mycompany.mypluginname.myapipackage;version="1.0.0" 

然後很好地省略.internal包。該平臺應該完成剩下的工作。順便說一句,你可以使用Import-Package:在任何依賴包中,插件等,而不是依賴於jar/project(這是舊的,糟糕的方式,不工作 - 就像你發現)。

這給你大量的代碼依賴關係的解耦。如果您決定您的插件代碼應該屬於不同的jar/bundle,那麼您只需移動單個軟件包,並使新軟件包/插件將其導出。由於客戶端軟件包只是從「雲」(雲作爲OSGi平臺)導入軟件包,因此您可以更自由地移動代碼。

注意:正如評論中提到的,你不需要在OSGi中運行你的應用程序來獲得這個「好處」。 Eclipse可以在OSGi包的限制下編譯它的代碼,並且你的構建/服務器可以在「未受保護的世界」中運行。例如OSGi清單不對第三方(希望使用.internal)強制執行任何操作,但向需要它們的用戶提供「通知」和限制。

+0

這就是我現在要做的,雖然我的一些插件還包含我在服務器代碼中使用的代碼,而不是通過OGSI。 – Uri 2009-02-16 00:46:08

+0

沒有什麼能阻止你設置eclipse來爲服務器開發使用OSGi信息。運行時類路徑和構建腳本可以保持原樣。例如爲您的客戶端罐添加OSGi清單。它實際上並沒有傷害任何東西...... – Stephen 2009-02-16 02:07:52

-5

除非您必須使用您信任的庫來處理別人的不可信代碼,否則請不要限制它。

需要內部/軟件包訪問有時會指示您的API設計失敗,並且直到長時間的後續處理後才能知道。

把它公開,命名爲InternalWhatever,並與之共存。

2

對於插件項目:使用Stephen提到的Manifest設置。 (您也可以通過清單編輯器的「運行」頁面進行編輯。請注意,如果你想只露出一包特定的插件,你可以做到這一點,以及使用

Export-Package: com.javadude.foo;x-friends:="com.javadude.fee" 

對於非插件項目:使用單獨的源文件夾來定義從項目中導出的內容。

  1. 右鍵單擊項目並選擇New源文件夾(也許它命名爲「內源」)
  2. 右鍵單擊項目,並選擇屬性
  3. 轉到Java構建路徑
  4. 點擊訂單和導出選項卡
  5. 取消選中您不希望導出

只有那些「排序和導出」下檢查源文件夾中的源文件會被添加到引用項目的類路徑中。