2012-08-07 20 views
1

我有一個插件A,它導出包foo.bar。在包foo.bar中有一個具有默認範圍成員的抽象類FooBar。在插件B中,我喜歡在同一個包中擴展FooBar,並訪問默認的作用域字段。無法訪問依賴插件的包作用域字段

插件的清單:

. 
Bundle-SymbolicName: A  
Export-Package: foo.bar 
. 

插件乙清單:

. 
Bundle-SymbolicName: B  
Require-Bundle: A 
. 

FooBar的類在插件答:

package foo.bar; 

public abstract class FooBar{ 
    int min = -1; 
} 

類MyFooBar在插件B:

package foo.bar; 

public class MyFooBar extends FooBar{ 
    public void setMin(int min){ 
    this.min = min; 
    } 
} 

其結果是:
由..Caused:java.lang.IllegalAccessError:試圖從類foo.bar.MyFooBar

訪問字段foo.bar.FooBar.min在正常的java環境我可以訪問包如果我在同一個軟件包中定義我的課程,可以選擇成員。顯然這不是在OSGI環境中,是嗎?

+0

插件B的Bundle-SymbolicName真的是「A」嗎?重複的名字可能導致奇怪的行爲 – Simon 2012-08-07 13:24:14

+0

感謝有關西蒙和弗雷德裏克的信息。我的問題是我擴展了log4j-Framework幾年前擴展了PatternConverter的模式類。現在我必須將它移植到eclipse-bundles。 – 2012-08-07 13:58:11

回答

0

嘗試使包B成爲A的片段(如果可能的話)。比B可以訪問包私有類,因爲有相同的包名稱和類加載器。

閱讀以下文章Split Packages – An OSGi nightmare - 它以明確的方式解釋問題。

0

你是對的,OSGI插件與java包不一樣。如果您真的想在兩個插件中分享相同的min價值,最好的選擇是通過擴展點分享。擴展點是OSGI在插件之間共享數據和代碼的方式。這導致了一種解決方案,不會導致插件之間的緊密耦合。

如果插件B確實必須訪問插件A中的min值,這可能表明這兩個類應該位於同一個插件中。

另見關於擴展點this question

的更多信息可以發現here

+0

在這個問題下看到我的評論。 – 2012-08-07 14:06:27

0

Eclipse插件/ OSGi包各自具有它們自己獨立的類加載器(因此命名空間)。包專用意味着相同的包和類加載器。

+0

在這個問題下看到我的評論。 – 2012-08-07 14:06:55