2012-05-15 82 views
0

未找到(編輯:問題就解決了 - 請參照最後的細節)類在OSGi的使用SwingUtilities.invokeLater時捆綁

我想在一個OSGi包來創建Swing JFrameWindowAdapter。當我使用SwingUtilities.invokeLater執行此操作時,找不到WindowAdapter類。沒有invokeLater它的作品。

我該怎麼做才能在使用invokeLater時發現WindowAdapter? 在OSGi環境中是不是invokeLater不合適?

細節:

我開始與我的自定義啓動,安裝軟件包並啓動Apache的菲利克斯框架實例。我的包的啓動方法是這樣的:

public void start(BundleContext arg0) throws Exception { 
    myFrame = new MyFrame(); 
    myFrame.open(); 
} 

這是MyFrame類:

public class MyFrame { 
    JFrame mainFrame; 

    public void open() { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       openImpl(); 
      } 
     }); 
     // If called like this it works: 
     // openImpl(); 
    } 

    public void openImpl() { 
     mainFrame = new JFrame("Title"); 
     mainFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
     WindowAdapter wa = new WindowAdapter() { 
     }; 
     mainFrame.addWindowListener(wa); 
     mainFrame.setSize(800, 600); 
     mainFrame.setLocationRelativeTo(null); 
     mainFrame.setVisible(true); 
    } 
} 

這是我表現的包:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.7.0_03-b05 (Oracle Corporation) 
Built-By: Rainer Schwarze 
Bundle-Name: DummyBdl 
Bundle-Description: Dummy Bundle 
Bundle-Vendor: admaDIC 
Bundle-Version: 0.0.1 
Bundle-Activator: dummybdl.Activator 
Import-Package: org.osgi.framework, javax.swing 
Export-Package: dummybdl.api 
Export-Service: dummybdl.Provider 

這是堆棧跟蹤這我得到:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1432) 
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72) 
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at dummybdl.MyFrame.openImpl(MyFrame.java:24) 
    at dummybdl.MyFrame$1.run(MyFrame.java:16) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

作爲一名OSGi新手​​,我嘗試了幾件事來解決它,但到目前爲止找不到解決方案。那麼,爲什麼不把我的第一個問題,在StackOverflow上:-)

編輯:事實證明,這個問題完全是我的

調試半小時後: 我的代碼停止openImpl之前OSGi框架被稱爲EDT。

因此Apache Felix框架將BundleWiringImpl實例(請參閱堆棧跟蹤)標記爲已處置。當我的openImpl在EDT中被調用時,BundleWiringImpl.getClassLoader返回null,因爲它被標記爲已處理。最終這導致NPE。 (我應該去張貼50行我菲利克斯裝載機的可能做出錯誤明顯的額外步驟。)

+0

如果代碼是準確的,那麼行MyFrame.java:24是「new JFrame()」,所以無法加載的類大概是javax.swing.JFrame。我真的被這個難住了。我想了很長一段時間...... –

+0

如果我有寫jar版本,那麼BundleWiringImpl的第1432行是這樣的:http://grepcode.com/file/repo1.maven.org/maven2/org。 apache.felix/org.apache.felix.framework/4.0.2/org/apache/felix/framework/BundleWiringImpl.java?av = h#1432,這意味着getClassLoader()返回null或m_revision爲null。 –

回答

0

我的代碼停止OSGi框架openImpl之前被調用的EDT。

沒有invokeLateropenImpl被立即調用,在我的其他代碼關閉OSGi框架之前。隨着invokeLater調用openImpl計劃在晚些時候,在「稍後」發生之前,我的代碼關閉了OSGi框架。

在這種情況下,Apache Felix框架將BundleWiringImpl實例(請參閱堆棧跟蹤)標記爲處置。當我的openImpl在EDT中被調用時,BundleWiringImpl.getClassLoader返回null,因爲它被標記爲已處理。最終這導致NPE。

+0

(發現自己的回答是可以接受的,並決定將我的問題從未答覆的池中移出...) –

0

答案WindowAdapter類您嘗試使用位於 java.awt.event,但你不要導入該軟件包。 編輯:這似乎並沒有解決問題(見評論),但下面的背景仍然存在。

背景故事您的清單看起來手工製作,我建議您不要這樣做(您會犯錯誤,並且保持清單很好地同步)是一件麻煩事。如果您使用的是Eclipse,請查看bndtools,如果是其他任何環境,請查看bnd

+0

當我將'java.awt.event'添加到Import-Package時,得到:'org.osgi.framework.BundleException:不允許導入java。*包:java.awt.event'。 –

+0

哦,好點,我完全錯過了。儘管如此,我仍堅持認爲你不應該手動建立清單,而是讓一個工具去做。我會爲此更新我的答案。 –

+0

我嘗試了bndtools,看它是否有一些我的新手理解不包含的魔法。但是相關的MANIFEST條目是相同的,並且異常仍然被拋出。與此同時,我找到了一篇有趣的文章來解決這個問題。當我在幾個小時內獲得一點空閒時間併發布更新時,我會閱讀它。 –

-1

stacktrace包含一些安全檢查「ProtectionDomain,.. doIntersectionPrivilege」。 您是否嘗試禁用SecurityManager。您可以禁用以下VM選項:

-Djava.security。經理=

也看這裏: How to disable Java security manager?

+0

我用'-Djava.security.manager -Djava.security.policy = java.policy'開始了我的應用程序,並把'grant {permission java.security.AllPermission; };在策略文件中。仍然是相同的堆棧跟蹤。沒有策略文件參數,我得到'java.security.AccessControlException:access denied(「java.lang.RuntimePermission」「createSecurityManager」)'。嗯。 –