Eclipse Launch-Configutation สำหรับ OSGI Framework ไม่ทำงานบน Mac

ฉันพยายามเริ่มการพัฒนาบันเดิลโดยใช้ Eclipse Kepler บน Mac (OS 10.8.4) ฉันสร้างชุด "Hello World" ขั้นต่ำและสร้างการกำหนดค่าการเรียกใช้ OSGI-Framework ที่สอดคล้องกัน เมื่อเริ่มต้นการกำหนดค่าการเปิดใช้ ฉันจะได้รับข้อยกเว้นต่อไปนี้เสมอ:

osgi> !SESSION 2013-09-08 23:03:50.713 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_51
java.vendor=Apple Inc.
BootLoader constants: OS=macosx, ARCH=x86_64, WS=cocoa, NL=de_DE
Command-line arguments:  -dev file:/Users/stephan/Documents/workspace/.metadata/.plugins/org.eclipse.pde.core/New_configuration (1)/dev.properties -os macosx -ws cocoa -arch x86_64 -consoleLog -console

!ENTRY org.eclipse.core.net 1 0 2013-09-08 23:03:53.012
!MESSAGE System property http.nonProxyHosts has been set to local|*.local|169.254/16|*.169.254/16 by an external source. This value will be overwritten using the values from the preferences
***WARNING: Display must be created on main thread due to Cocoa restrictions.

!ENTRY org.eclipse.equinox.preferences 4 2 2013-09-08 23:03:53.293
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.equinox.preferences".
!STACK 0
java.lang.ExceptionInInitializerError
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.setDefault(DebugUIPreferenceInitializer.java:186)
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.setThemeBasedPreferences(DebugUIPreferenceInitializer.java:204)
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.initializeDefaultPreferences(DebugUIPreferenceInitializer.java:79)
    at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper$1.run(PreferenceServiceRegistryHelper.java:300)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper.runInitializer(PreferenceServiceRegistryHelper.java:303)
    at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper.applyRuntimeDefaults(PreferenceServiceRegistryHelper.java:131)
    at org.eclipse.core.internal.preferences.PreferencesService.applyRuntimeDefaults(PreferencesService.java:368)
    at org.eclipse.core.internal.preferences.DefaultPreferences.applyRuntimeDefaults(DefaultPreferences.java:221)
    at org.eclipse.core.internal.preferences.DefaultPreferences.load(DefaultPreferences.java:274)
    at org.eclipse.core.internal.preferences.EclipsePreferences.create(EclipsePreferences.java:409)
    at org.eclipse.core.internal.preferences.EclipsePreferences.internalNode(EclipsePreferences.java:670)
    at org.eclipse.core.internal.preferences.EclipsePreferences.node(EclipsePreferences.java:812)
    at org.eclipse.core.internal.preferences.AbstractScope.getNode(AbstractScope.java:38)
    at org.eclipse.core.runtime.preferences.DefaultScope.getNode(DefaultScope.java:76)
    at org.eclipse.ui.preferences.ScopedPreferenceStore.getDefaultPreferences(ScopedPreferenceStore.java:250)
    at org.eclipse.ui.preferences.ScopedPreferenceStore.getPreferenceNodes(ScopedPreferenceStore.java:285)
    at org.eclipse.ui.preferences.ScopedPreferenceStore.internalGet(ScopedPreferenceStore.java:475)
    at org.eclipse.ui.preferences.ScopedPreferenceStore.getString(ScopedPreferenceStore.java:535)
    at org.eclipse.debug.internal.ui.launchConfigurations.PerspectiveManager.initPerspectives(PerspectiveManager.java:996)
    at org.eclipse.debug.internal.ui.launchConfigurations.PerspectiveManager.startup(PerspectiveManager.java:269)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.start(DebugUIPlugin.java:542)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390)
    at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1176)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
Caused by: org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4397)
    at org.eclipse.swt.SWT.error(SWT.java:4312)
    at org.eclipse.swt.SWT.error(SWT.java:4283)
    at org.eclipse.swt.widgets.Display.error(Display.java:1076)
    at org.eclipse.swt.widgets.Display.createDisplay(Display.java:833)
    at org.eclipse.swt.widgets.Display.create(Display.java:816)
    at org.eclipse.swt.graphics.Device.<init>(Device.java:130)
    at org.eclipse.swt.widgets.Display.<init>(Display.java:707)
    at org.eclipse.swt.widgets.Display.<init>(Display.java:698)
    at org.eclipse.swt.widgets.Display.getDefault(Display.java:1396)
    at org.eclipse.jface.preference.PreferenceConverter.<clinit>(PreferenceConverter.java:81)
    ... 37 more

ฉันลองใช้ Apple JDK 1.6.0_51 และ Oracle JDK 1.7.0_25 ฉันลองใช้สวิตช์ -XstartOnFirstThread ด้วย ฉันมักจะได้รับข้อผิดพลาดเดียวกัน

มัดมีลักษณะดังนี้:

package testbundle;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

/*
 * (non-Javadoc)
 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
 */
public void start(BundleContext context) throws Exception {
    System.out.println("Hello World!!");
}

/*
 * (non-Javadoc)
 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
 */
public void stop(BundleContext context) throws Exception {
    System.out.println("Goodbye World!!");
}

}

บางทีอาจมีคนให้คำแนะนำฉันได้

ขอบคุณสเตฟาน


person stephan    schedule 08.09.2013    source แหล่งที่มา
comment
คุณช่วยแสดงรหัสให้เราหน่อยได้ไหม? ข้อผิดพลาดมาจากปัญหา SWT ดูเหมือนว่าการเข้าถึงเธรดไม่ถูกต้อง   -  person GGrec    schedule 09.09.2013
comment
รหัสของมัดนั้นง่ายมาก มันเป็นเพียง Activator ที่มี println ฉันใส่รหัสในคำถามของฉัน   -  person stephan    schedule 13.09.2013


คำตอบ (1)


ฉันคิดว่าบันเดิล Eclipse ต้องเริ่มต้นด้วยแฟล็ก START_ACTIVATION_POLICY เนื่องจากมีโค้ด SWT อยู่ในตัวกระตุ้น ดังนั้นจึงสันนิษฐาน (ไม่ถูกต้อง!) ว่าบันเดิลเหล่านั้นอยู่ในเธรดหลัก

โดยพื้นฐานแล้วคุณไม่ควรใช้โปรแกรมเรียกทำงาน "OSGi Framework" ของ PDE หากคุณมีบันเดิล Eclipse/SWT คุณควรใช้ตัวเรียกใช้งาน "Eclipse Application" เหมือนกับว่าคุณกำลังพัฒนาแอป RCP

person Neil Bartlett    schedule 09.09.2013
comment
ช่วยแนะนำวิธีตั้งธงหน่อยครับ ฉันเปลี่ยนระดับเริ่มต้นในการกำหนดค่าการเปิดตัว แต่ฉันคิดว่านี่ไม่ถูกต้อง ขออภัยที่ออฟไลน์เป็นเวลาหนึ่งสัปดาห์ - person stephan; 13.09.2013
comment
ปัญหานี้เป็นปัญหา; ฉันไม่คิดว่าคุณสามารถตั้งค่าได้หากคุณใช้ตัวเรียกใช้งาน OSGi Framework ของ PDE - person Neil Bartlett; 13.09.2013