Konfigurasi Peluncuran Eclipse untuk Kerangka OSGI tidak berfungsi di Mac

Saya mencoba memulai pengembangan bundel menggunakan Eclipse Kepler di Mac (OS 10.8.4). Saya membuat bundel minimal "Hello World" dan membuat konfigurasi peluncuran OSGI-Framework yang sesuai. Saat memulai konfigurasi peluncuran saya selalu mendapatkan pengecualian berikut:

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

Saya mencobanya menggunakan Apple JDK 1.6.0_51 dan Oracle JDK 1.7.0_25. Saya juga mencoba tombol -XstartOnFirstThread. Saya selalu mendapatkan kesalahan yang sama.

Bundelnya terlihat seperti ini:

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!!");
}

}

Mungkin seseorang bisa memberi saya petunjuk.

Terima kasih Stephan


person stephan    schedule 08.09.2013    source sumber
comment
Bisakah Anda menunjukkan kepada kami beberapa kode? Kesalahan berasal dari masalah SWT. Tampaknya akses thread tidak valid.   -  person GGrec    schedule 09.09.2013
comment
Kode bundelnya sangat sederhana. Itu hanya Aktivator dengan println. Saya memasukkan kode ke dalam pertanyaan saya.   -  person stephan    schedule 13.09.2013


Jawaban (1)


Menurut saya bundel Eclipse harus dimulai dengan flag START_ACTIVATION_POLICY, karena bundel tersebut berisi kode SWT di aktivatornya dan oleh karena itu berasumsi (secara keliru!) bahwa bundel tersebut ada di thread utama.

Pada dasarnya Anda tidak boleh menggunakan peluncur "OSGi Framework" PDE jika Anda memiliki bundel Eclipse/SWT. Anda harus menggunakan peluncur "Aplikasi Eclipse", seolah-olah Anda sedang mengembangkan aplikasi RCP.

person Neil Bartlett    schedule 09.09.2013
comment
Bisakah Anda memberi saya petunjuk cara menyetel bendera. Saya mengubah level awal dalam konfigurasi peluncuran. Tapi menurut saya ini tidak benar. Maaf karena offline selama seminggu. - person stephan; 13.09.2013
comment
Ini masalahnya; Saya rasa Anda tidak dapat mengaturnya jika Anda menggunakan peluncur Kerangka OSGi PDE. - person Neil Bartlett; 13.09.2013