Probleme beim Erstellen eines RCP Products

Blechmann

Grünschnabel
Hallo zusammen,
ich habe mich vor kurzem in die Entwicklung von Anwendung auf RCP Basis eingearbeitet.
Den Umgang mit Plugins und Extensions habe soweit verstanden und mein Program startet auch wenn ich es aus der Eclipse IDE starte, nur das Exportieren in ein Product bereitet mir Kopfzerbrechen:
  1. Run Configuration
    Ich habe lauffähige Konfigurationen für mein Program, sowohl als Application und als Product. Wenn ich allerdings mein Program aus dem "Product Configuration Editor" starten will kommt eine:
    org.osgi.framework.BundleException: The activator org.eclipse.ui.internal.WorkbenchPlugin for bundle org.eclipse.ui.workbench is invalid
    Die Exception wird dadurch verursacht (so vermute ich), dass das Bundle org.eclipse.swt.gtk.linux.x86_64 wieder aus der Configuration rausgenommen wird, obwohl es eigendlich mit starten sollte.

    Wenn ich es danach wieder in der "Run Configuration" aktiviere und das argument -arch manuell als "x86_64" eintrage startet das Programm wieder wie gewünscht aus der "Run Configuration" Ansicht. Nur halt nicht aus der dem "Product Configuration Editor".
    Warum ist das so ?
  2. Exportieren des Products
    Natürlich habe ich auch schon versucht mein Product zu exportieren. Der Vorgang wird erfolgreich abgeschlossen und ich erhalte folgende Ordnerstruktur:
    • p2
      • org.eclipse.equinox.p2.core
        • cache (mit inhalt artifacts.xml & binary Ordner )
      • org.eclipse.equinox.p2.engine
        • profileRegistry (mit inhalt profile.profile Ordner der 3 profile.gz dateien enthält)
    • plugins
      • org.eclipse.equinox.launcher.gtk.linux.x86_1.0.200.v20090520
        • about.html
        • eclipse_1206.so
        • launcher.gtk.linux.x86.properties
        • META_INF
          • ECLIPSE.RSA
          • ECLIPSE.SF
          • eclipse.inf
          • MANIFEST.MF
      • viele plugins.... als *.jar
    • artifacts.xml
Hier ist es jetzt schonmal komisch das gtk.linux-x86_1.0... vorliegt anstatt der x86_64 wie in der .product beschrieben:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<?pde version="3.5"?>

<product name="Suite" uid="de.xxx.xxx.xx.beams" id="de.xxx.xxx.xx.xx.suite.suiteproduct" application="de.xxx.xxx.xx.xx.suite.application" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">


   <configIni use="default">
   </configIni>

   <launcherArgs>
      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
   </launcherArgs>

   <windowImages/>


   <launcher>
      <solaris/>
      <win useIco="false">
         <bmp/>
      </win>
   </launcher>


   <vm>
      <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.0%Foundation-1.0</linux>
   </vm>


   <plugins>
      <plugin id="com.ibm.icu"/>
      <plugin id="de.xxx.xxx.xx.xx.jBeam"/>
      <plugin id="de.xxx.xxx.xx.xx.joy"/>
      <plugin id="de.xxx.xxx.xx.xx.mon"/>
      <plugin id="de.xxx.xxx.xx.xx.mon.coordinate"/>
      <plugin id="de.xxx.xxx.xx.xx.mon.framegrabber"/>
      <plugin id="de.xxx.xxx.xx.xx.suite"/>
      <plugin id="javax.servlet"/>
      <plugin id="org.eclipse.core.commands"/>
      <plugin id="org.eclipse.core.commands.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.contenttype"/>
      <plugin id="org.eclipse.core.contenttype.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.databinding"/>
      <plugin id="org.eclipse.core.databinding.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.databinding.observable"/>
      <plugin id="org.eclipse.core.databinding.observable.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.databinding.property"/>
      <plugin id="org.eclipse.core.databinding.property.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.expressions"/>
      <plugin id="org.eclipse.core.expressions.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.jobs"/>
      <plugin id="org.eclipse.core.jobs.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.runtime"/>
      <plugin id="org.eclipse.core.runtime.compatibility.auth"/>
      <plugin id="org.eclipse.core.runtime.compatibility.auth.nl_de" fragment="true"/>
      <plugin id="org.eclipse.core.runtime.nl_de" fragment="true"/>
      <plugin id="org.eclipse.equinox.app"/>
      <plugin id="org.eclipse.equinox.app.nl_de" fragment="true"/>
      <plugin id="org.eclipse.equinox.common"/>
      <plugin id="org.eclipse.equinox.common.nl_de" fragment="true"/>
      <plugin id="org.eclipse.equinox.preferences"/>
      <plugin id="org.eclipse.equinox.preferences.nl_de" fragment="true"/>
      <plugin id="org.eclipse.equinox.registry"/>
      <plugin id="org.eclipse.equinox.registry.nl_de" fragment="true"/>
      <plugin id="org.eclipse.help"/>
      <plugin id="org.eclipse.help.nl_de" fragment="true"/>
      <plugin id="org.eclipse.jface"/>
      <plugin id="org.eclipse.jface.databinding"/>
      <plugin id="org.eclipse.jface.databinding.nl_de" fragment="true"/>
      <plugin id="org.eclipse.jface.nl_de" fragment="true"/>
      <plugin id="org.eclipse.osgi"/>
      <plugin id="org.eclipse.osgi.nl_de" fragment="true"/>
      <plugin id="org.eclipse.osgi.services"/>
      <plugin id="org.eclipse.osgi.services.nl_de" fragment="true"/>
      <plugin id="org.eclipse.swt"/>
      <plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
      <plugin id="org.eclipse.swt.nl_de" fragment="true"/>
      <plugin id="org.eclipse.ui"/>
      <plugin id="org.eclipse.ui.nl_de" fragment="true"/>
      <plugin id="org.eclipse.ui.workbench"/>
      <plugin id="org.eclipse.ui.workbench.nl_de" fragment="true"/>
   </plugins>

   <configurations>
      <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
      <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
      <plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
   </configurations>

</product>
Außerdem wir keine "default" config.ini im configuration Ordner erstellt obwohl ich das gerne hätte, habe mir dann selbst eine zusammengeschustert, mehr oder weniger gewusst wie:
Code:
#This configuration file was written by: org.eclipse.equinox.internal.frameworkadmin.equinox.EquinoxFwConfigFileParser
#Mon May 10 14:21:53 CEST 2010
eclipse.product=de.xxx.xx.xx.suite.suiteproduct
osgi.bundles=org.eclipse.equinox.common_3.5.1.R35x_v20090807-1100.jar@2\:start,org.eclipse.core.runtime_3.5.0.v20090525.jar@start,de.xxx.xxx.xx.xx.joy_1.0.0.201006081328.jar,org.eclipse.core.databinding.observable.nl_de_3.5.0.v20091121043401.jar,de.xxx.xxx.xx.xx.jBeam_1.0.0.201006081328.jar,org.eclipse.equinox.preferences_3.2.301.R35x_v20091117.jar,org.eclipse.core.databinding.nl_de_3.5.0.v20091121043401.jar,de.xxx.xxx.xx.xx.mon.framegrabber_1.0.0.201006081328.jar,javax.servlet_2.5.0.v200806031605.jar,org.eclipse.osgi.nl_de_3.5.0.v20091121043401.jar,org.eclipse.ui.workbench.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.runtime.compatibility.auth.nl_de_3.5.0.v20091121043401.jar,org.eclipse.ui_3.5.2.M20100120-0800.jar,org.eclipse.core.expressions.nl_de_3.5.0.v20091121043401.jar,org.eclipse.jface_3.5.2.M20100120-0800.jar,org.eclipse.help_3.4.1.v20090805_35x.jar,org.eclipse.jface.databinding.nl_de_3.5.0.v20091121043401.jar,org.eclipse.equinox.registry.nl_de_3.5.0.v20091121043401.jar,org.eclipse.equinox.preferences.nl_de_3.5.0.v20091121043401.jar,org.eclipse.osgi.services_3.2.0.v20090520-1800.jar,org.eclipse.help.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.commands.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.commands_3.5.0.I20090525-2000.jar,org.eclipse.ui.workbench_3.5.2.M20100113-0800.jar,org.eclipse.equinox.app.nl_de_3.5.0.v20091121043401.jar,com.ibm.icu_4.0.1.v20090822.jar,org.eclipse.core.databinding.observable_1.2.0.M20090902-0800.jar,org.eclipse.equinox.registry_3.4.100.v20090520-1800.jar,org.eclipse.equinox.common.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.contenttype.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.databinding.property.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.runtime.compatibility.auth_3.2.100.v20090413.jar,org.eclipse.core.jobs_3.4.100.v20090429-1800.jar,org.eclipse.ui.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.jobs.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.databinding.property_1.2.0.M20090819-0800.jar,org.eclipse.equinox.app_1.2.1.R35x_v20091203.jar,de.xxx.xxx.xx.xx.mon_1.0.0.201006081328.jar,org.eclipse.jface.nl_de_3.5.0.v20091121043401.jar,org.eclipse.swt_3.5.2.v3557f.jar,org.eclipse.swt.nl_de_3.5.0.v20091121043401.jar,de.xxx.xxx.xx.xx.suite_1.0.0.201006081328.jar,org.eclipse.core.databinding_1.2.0.M20090819-0800.jar,org.eclipse.core.runtime.nl_de_3.5.0.v20091121043401.jar,org.eclipse.core.contenttype_3.4.1.R35x_v20090826-0451.jar,org.eclipse.jface.databinding_1.3.1.M20090826-0800.jar,org.eclipse.core.expressions_3.4.101.R35x_v20100209.jar,de.xxx.xxx.xx.xx.mon.coordinate_1.0.0.201006081328.jar,org.eclipse.osgi.services.nl_de_3.5.0.v20091121043401.jar
osgi.bundles.defaultStartLevel=4
osgi.framework=./plugins/org.eclipse.osgi_3.5.2.R35x_v20100126.jar

starten tue ich dann mit folgendem Befehl aus meinem Product Root verzeichnis
Code:
/home/pg/jdk64/jre/bin/java -classpath ./plugins/org.eclipse.osgi_3.5.2.R35x_v20100126.jar org.eclipse.core.runtime.adaptor.EclipseStarter -consolelog
Daraus folgt dann folgendes:
Code:
!SESSION 2010-06-11 09:35:23.951 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_18
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -consolelog

!ENTRY org.eclipse.osgi 4 0 2010-06-11 09:35:25.802
!MESSAGE Application error
!STACK 1
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:74)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.main(EclipseStarter.java:150)
@see config.ini
Code:
... ,org.eclipse.core.runtime_3.5.0.v20090525.jar@start , ...
Da hänge ich im Moment und weiß nicht weiter, starte ich das Program überhaupt richtig ?
Weitere Fragen:
  • Muss man dann später wenn alles richtig geklappt hat die Eclipse IDE auch auf dem Rechner haben um das Product zu starten ? oder ist das sozusagen standalone?
  • ... mir fällt bestimmt noch was ein :)

Sonstiges:
  • OS: Suse Linux
  • Eclipse SDK: Version: 3.6.0
  • JDK: 1.6 32bit & 64bit


######## EDIT
Was für ein super Tag, es läuft! Aber es ist wahrscheinlich ein etwas "dirty" Lösung, da ich einfach einpaar Dateien kopiert habe und die config.ini ergänzt habe.
Schön wäre es zu verstehen, warum Eclipse mir die config.ini nicht automatisch erstellt ?

Zur Lösung beigetragen hat jetzt, das ich die org.eclipse.swt.gtk.linux.x86_64_3.5.2.v3557f.jar aus einem Verzeichnis meines eclipse workspace in mein plugin verzeichnis des Product Ordners kopiert habe. Ein eclipse.application in der config.ini gesetzt habe (und eclipse.product rausgenommen habe).
Das Problem mit der fehlenden x86_64 gtk plugin hat sich duch ein explizites "export for multiple Platforms" -> linux (gtk/x86_64) gelöst.

Aber schön ist das nicht! (und vorallem nicht alltagstauglich, denn das Program lässt sich nicht mehr sauber beenden durch ein schließen des Fensters)
Bitte um Kritik und Bessermachvorschläge =)

(ps: es existiert auch keine .product in meiner Verzeichnisstruktur bzw. plugins :/ , ich glaube da ist einiges verhunzt)
######## /EDIT

Viele Grüße & und einen sonnigen Tag
Blechmann


### Gelöst ###
Habe den Fehler gefunden und zwar kann man unter den Eigenschaften der Plugin-Entwicklung die Target-Platform einstellen. Da war eine x86 Machine eingetragen, da eclipse mit einer 32bit JVM lief.
Also: Eclipse 64bit starten und die Target-Platform richtig konfigurieren.
Jetzt funktioniert alles :)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück