# PDEBuild mit p2 updatesite



## thomet (30. Nov 2009)

Hy,
ich lasse meine anwendung duch ein pde-build bauen. dabei möchte ich das er mir gleich die updatesite für p2 mit generiert.
nun hab ich gelesen das dies einfach durch folgende einstellungen in der build.properties realisiert werden kann:

```
p2.gathering = true;
p2.metadata.repo=file:${buildDirectory}/repository
p2.artifact.repo=file:${buildDirectory}/repository
```

jedoch wird nix dergleichen erstellt. Wenn ich jedoch dazu noch folgendes aktiviere:

```
generate.p2.metadata = true;
```

jedoch habe ich gelesen das das ein altes verfahren ist... und das möchte ich ja nicht.

woran könnte das liegen???

und dazu noch eine zweite frage.. zur zeit baue ich ja über die pde tools.... jedoch damit das alles richtig funktioniert mit p2 muss ich ja meine anwendung quasi beim builden mit p2 installieren.. was ja bei den pde tools nicht der fall ist (zumindestens denk ich das?!?) .. wie kann das headless realisiert werden .. (ich muss für win, linux und mac builden) .....

danke für eure hilfe..

mfg


----------



## Wildcard (30. Nov 2009)

Ich würde dir empfehlen Buckminster statt dem pde Build zu verwenden. Damit lassen sich p2 Sites out-of-the-box für jedes Eclipse Feature per Knopfdruck (und Headless) erstellen und du brauchst nichtmal mehr Ant-Scripts dafür:
Eclipse Buckminster Project


----------



## thomet (1. Dez 2009)

ich wuste das das jetzt kommt *g ... ich hab mich schon bissel mit buckmister probiert... jedoch hab ich mit meiner anwendung netma nen einfaches build hinbekommen ... (ist recht groß und hat einige features) .... 
ich muss jedoch schnellstmöglich diesen prozess hin bekommen... in 1-2 tagen... und buckminster ist ein sehr schönes tool.. jedoch muss ich mich da komplett neu einarbeiten... mit ant hab ich halt schon erfahrungen.... 

würde ja natürlich lieber auf buckminster umsteigen aber es kostet erstma zu viel zeit.... gibs den keine "einfache" ant lösung??

mfg

EDIT:

ich kann ja ma den groben aufbau meiner anwendung schildern:

prerequisites-feature: hier sind alle benötigeten externen plugins (org.eclipse. .... p2 ... etc) integriert (diese sollen auch nur über meine seite updatebar sein)

platform-feature: hier sind meine platform-plugins definiert z.b. my.app.platform

platform-product-feature: hier ist die .product-Datei platform-product-feature als dependency, feature mit platform- + prerequisites- + languagepack-feature als dependency

meine platform ist durch module erweiterbar ... zb Modul1:

modul1-feature: my.app.modul1 ... etc.

modul1-profuct-feature: hier ist die .product-Datei für platform + modul1, feature mit platform-product-feature + modul1-feature als dependency

----------------------------

das ist die grundlegenste strucktur...

nun soll die platform über das updatesystem zb modul1 nach installieren können... das ganze soll über p2 laufen.... 

wie müßte ich jetzt vorgehen das ganze mit buckminster zu realisieren?? ich hab das tutorial schon durchgearbeitet.. dort ist es jedoch ein sehr einfaches beispiel..... 

achja.. meine TP hab ich selber zusammengestellt.. und soll auch nicht aus dem netz geladen werden und erstellt.. sondern direkt die versionen genommen werden die ich definiert habe...

als buildsystem hab ich ne linuxkiste mit hudson (buckminster plugin installiert) ....

ich hab halt ne so ganz kapiert wie ich das mit buckminster löse mit den verschiedenen features... ich möchte zum schluss die platform haben.. und das modul seperat .. so das man die platform und zb lang packs über updatesite updaten kann.. bzw das modul nachinstallieren

danke schonma für die hilf  .. ich hoffe das ihr aus meinen text schlau werdet und mit weiter helfen könne

mfg thomas


----------



## Wildcard (1. Dez 2009)

Ich kenne die Spezifika deiner Anwendung nicht, aber grob:


> prerequisites-feature: hier sind alle benötigeten externen plugins (org.eclipse. .... p2 ... etc) integriert (diese sollen auch nur über meine seite updatebar sein)


Sollte out of the box funktionieren. Du rufst die Action site.p2 auf dem Feature auf und bekommst deine Update Site



> platform-feature: hier sind meine platform-plugins definiert z.b. my.app.platform


Nennen wir das Ding Target Platform und du hast es irgendwo lokal vorliegen (so habe ich dich verstanden).
ruf Buckminster auf mit setpref targetPlatformPath=/path/to/target/platfrom
Nun läuft dein Build gegen dein platform-feature.



> platform-product-feature: hier ist die .product-Datei platform-product-feature als dependency, feature mit platform- + prerequisites- + languagepack-feature als dependency


Alles muss in einem p2 Repository vorliegen bevor du ein Produkt daraus bauen kannst. Das geht wahlweise händisch (du hast alles zusammengestellt und willst es nur verwenden), per Buckminster (site.p2 action), oder mit dem Buckminster Site Aggregator (du bedienst dich aus n verschiedenen, fertigen Repositories wie Eclipse Update Sites, lokale Archive,...) oder einem Mix aus allen dreien.

Sobald deine Quellen zusammen sind kommt der letzte Schritt, ein Produkt zu assemblieren. Dazu wird die p2 Director Applikation verwendet. Als Quelle dienen p2 Repositories und du übergibst als Argument welche Features in die Platform installiert werden sollen.
Den p2 Director steuerst du wahlweise über Ant, Shell-Script, oder Buckminster.



> wie müßte ich jetzt vorgehen das ganze mit buckminster zu realisieren?? ich hab das tutorial schon durchgearbeitet.. dort ist es jedoch ein sehr einfaches beispiel.....


Ich habe sehr aufwändige builds auf Buckminster migriert, an der Mächtigkeit sollte es also nicht scheitern. Es muss aber natürlich nicht immer Buckminster sein, auch pures Ant ist meistens möglich und dann gibt es da noch Athena Common Build. Ich würde immer zur einfachsten Lösung greifen und für Eclipse Produkte ist das meiner Meinung nach Buckminster, aber Meinungen können unterschiedlich sein 

Wenn du konkretere Fragen hast, go ahead


----------



## thomet (2. Dez 2009)

ok ich hab mich jetzt doch nochma überreden lassen .. das ganze zu teste mit buckminster.... hab euch den fehler gefunden den ich in nen andern beitrag ma gepostet habe... und konnte im eclipse ein buckminster export machen.. der auch funktioniert *freu  ..

nun wollt ich das ganze auf meine buildserver (hudson) zum laufen bringen... dabei hab ich mich an folgendes tutorial gehalten:
Building Eclipse RCP applications using Buckminster and Hudson

jetzt hab ich folgenden fehler und verstehe nicht warum:


```
...
A         myapp.product.feature
A         myapp.product.feature/build
A         myapp.product.feature/build/product.ant
AU        myapp.product.feature/.project
AU        myapp.product.feature/plugin_customization.ini
AU        myapp.product.feature/MyApp.product
A         myapp.product.feature/buckminster.cspex
AU        myapp.product.feature/build.properties
AU        myapp.product.feature/feature.xml
...
At revision 15474
Commandline: 
java -Dbuckminster.output.root=/home/hudson/jobs/BM_MyApp/workspace/arch/x86/os/macosx/ws/cocoa//buckminster.output -Dbuckminster.temp.root=/home/hudson/jobs/BM_MyApp/workspace/arch/x86/os/macosx/ws/cocoa//buckminster.temp -Xmx1536M -Dtarget.os=macosx -Dtarget.ws=cocoa -Dtarget.arch=x86 -jar plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar -application org.eclipse.buckminster.cmdline.headless -data /home/hudson/jobs/BM_MyApp/workspace/arch/x86/os/macosx/ws/cocoa/ --loglevel info -S /home/hudson/jobs/BM_MyApp/configurations/axis-arch/x86/axis-os/macosx/axis-ws/cocoa/builds/2009-12-02_11-53-01/commands.txt INFO:  setpref 'targetPlatformPath=/home/hudson/buildtools/targetPlatform/MyApp/eclipse'
targetPlatformPath set to the value '/home/hudson/buildtools/targetPlatform/MyApp/eclipse'
INFO:  import '/home/hudson/jobs/BM_MyApp/workspace/arch/x86/os/macosx/ws/cocoa//com.myapp.site/site.cquery'
INFO:  Import complete.
INFO:  perform 'myapp.product.feature#create.product.zip'
No component named myapp.product.feature is known to Buckminster
Archiviere Artefakte
Finished: FAILURE
```

buckminster.cspex

```
<?xml version="1.0" encoding="UTF-8"?>
<cspecExtension
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:bc="http://www.eclipse.org/buckminster/Common-1.0"
	xmlns="http://www.eclipse.org/buckminster/CSpec-1.0">

    <actions>
        <public name="create.product" actor="ant">
        <actorProperties>
            <property key="buildFile" value="build/product.ant"/>
            <property key="targets" value="create.product"/>
        </actorProperties>
        <properties>
            <property key="profile" value="MyAppProfile"/>
            <property key="iu" value="MyAppProduct"/>
        </properties>
            <prerequisites alias="repository">
                <attribute name="site.p2"/>
            </prerequisites>
        <products alias="destination" base="${buckminster.output}">
            <path path="MyApp/"/>
        </products>
        </public>
        <public name="create.product.zip" actor="ant">
        <actorProperties>
            <property key="buildFileId" value="buckminster.pdetasks"/>
            <property key="targets" value="create.zip"/>
        </actorProperties>
            <prerequisites alias="action.requirements">
                <attribute name="create.product"/>
            </prerequisites>
        <products alias="action.output" base="${buckminster.output}">
            <path path="MyApp.zip"/>
        </products>
        </public>
    </actions>
</cspecExtension>
```

product.ant

```
<project>
	 <pathconvert property="equinox.launcher.jar">
	   <first count="1">
	     <sort>
	       <fileset dir="${eclipse.home}/plugins" includes="**/org.eclipse.equinox.launcher_*.jar"/>
	       <reverse xmlns="antlib:org.apache.tools.ant.types.resources.comparators">
	         <date/>
	       </reverse>
	     </sort>
	   </first>
	 </pathconvert>

	<target name="create.product">
		<property name="destination" location="${sp:destination}"/>
		<delete dir="${destination}"></delete>
		<makeurl property="repository" file="${sp:repository}"/>
		<mkdir dir="${destination}"/>
		<echoproperties ></echoproperties>
		<echo message="${equinox.launcher.jar}"/>
		<echo message="${repository}"/>
		<echo message="${destination}"/>
		<java jar="${equinox.launcher.jar}" fork="true" failonerror="true" >
			<arg value="-application"/>
			<arg value="org.eclipse.equinox.p2.director"/>
			<arg value="-artifactRepository"/>
			<arg value="file:${repository}"/>
			<arg value="-metadataRepository"/>
			<arg value="file:${repository}"/>
			<arg value="-destination"/>
			<arg value="${destination}"/>
			<arg value="-bundlepool"/>
			<arg value="${destination}"/>
			<arg value="-profile"/>
			<arg value="${profile}"/>
			<arg value="-profileProperties" />
			<arg value="org.eclipse.update.install.features=true" />
			<arg value="-installIU"/>
			<arg value="${iu}"/>
			<arg value="-p2.os" />
			<arg value="${target.os}" />
			<arg value="-p2.ws" />
			<arg value="${target.ws}" />
			<arg value="-p2.arch" />
			<arg value="${target.arch}" />
			<arg value="-consoleLog"/>
			<jvmarg value="-Declipse.p2.data.area=${destination}/p2"/>
			<jvmarg value="-Declipse.p2.profile=${profile}"/>
		</java>
	</target>
</project>
```

Id vom MyApp.product ist "MyAppProduct" ...

ich baue unter nem linux.. fals das was beeinflussen könnte...

meine buckminster einstellungen

```
setpref targetPlatformPath=/home/hudson/buildtools/targetPlatform/MyApp/eclipse
import ${WORKSPACE}/com.myapp.site/site.cquery
perform myapp.product.feature#create.product.zip
```


ich bittte um schnelle hilfe.. es ist eilig .. danke 

mfg thomas

EDIT:

hier noch meine resources.rmap aus com.myapp.site:

```
<?xml version="1.0" encoding="UTF-8"?>
<rmap
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.eclipse.org/buckminster/RMap-1.0"
    xmlns:bc="http://www.eclipse.org/buckminster/Common-1.0"
    xmlns:mp="http://www.eclipse.org/buckminster/MavenProvider-1.0"
    xmlns:pp="http://www.eclipse.org/buckminster/PDEMapProvider-1.0">

    <searchPath name="resources">
        <provider readerType="local" componentTypes="osgi.bundle,eclipse.feature"
                  mutable="true" source="true">
            <uri format="file:///{0}/{1}/">
                <bc:propertyRef key="workspace.root" />
                <bc:propertyRef key="buckminster.component" />
            </uri>
        </provider>
    </searchPath>

    <locator searchPathRef="resources"/>

</rmap>
```

und site.cquery aus com.myapp.site:

```
<?xml version="1.0" encoding="UTF-8"?>
<cq:componentQuery xmlns:cq="http://www.eclipse.org/buckminster/CQuery-1.0" resourceMap="resources.rmap">
    <cq:rootRequest name="com.myapp.site" componentType="eclipse.feature"/>
</cq:componentQuery>
```


----------



## quiddix (2. Dez 2009)

Hi,
les dir mal diesen Thread hier eurch:
Eclipse Community Forums

Hier hat mir Wildcard erklärt, was mein Problem war und ich denke du machst vielleicht etwas ähnliches falsch (ich bin der Meinung, dass auch das Tutorial hier einen Fehler enthält).

Du hast sicherlich auch ein *.site Feature, das dein product.feature als included Feature hat.
Im Product Feature ist dein build Ordner mit dem Ant-Skript und die .cspex Datei.

Kopiere diese Beiden Dateien (inkl Ordner wenn nötig) in das .site feature und rufe dann in Hudson von dort aus die Action auf.

Für eine genauere Beschreibung les mal mein Problem vom oberen Link durch, ich denke wie gesagt es handelt es sich hierbei um ein ähnliches Problem.
MFG TW


----------



## thomet (2. Dez 2009)

hy danke für die antwort..


zeigst du von deinem produkt aus .. dann auf das site-feature.. oder auf die featrues die in dem site-feature drin stehen??

EDIT:

ein weiteres sehr merkwürdiges problem:
ich hab mit hilfe von buckminster ein export aus eclipse gemacht.... nach dem export hab ich eine kopie auf dem desktop der anwendung (kompletter export) angelegt.. und wolle nun test ob das updaten funktioniert....
meine updateseite wurde auch angezeigt.. und die möglichen features die ich nachinstallieren kann... jetzt hab ich ein feature ausgewählt und installiert.. nach einem neustart der anwendung... und einen blick in den updatemanager.. ist angeblich das feature installiert.. nach einen blick in den plugins ordner.. sehe ich das dort nicht das gewünsche hinzugekommen ist...

jetzt kommt aber das total verwirrende:
ich hab die anwendung von den ort aus gestartet wo sie von buckminster hin gebaut wurde... und dort wurde das plugin installiert...  d.h. meine kopie aufm desktop hat das plugin in das orginal installiert... auch die anzeige der installierten plugins bezieht sich auf das orginal...

um gleich meine absolute dummheit auszuschließen *g ... nein ich hab keine verkünpfung gemacht.. sondern kopiert.. .und ja ich ha b auch wirklich die anwendung auf dem desktop gestartet und nicht das orginal... 

auch nach mehreren versuchen bestätigt sich dieses merkwürdeige sache...

bitte helft mir *g .... ist echt wichtig.. ich muss das bis morgen hinbekommen haben...

danke an euch..


----------



## quiddix (2. Dez 2009)

Hi.

ich beschreib es mal ein wenig genauer.

Ich habe:
-com.example.mail = mail template plugin
-com.example.mail.product = feature in dem meine product configuration liegt
-com.example.mail.site = Feature zum erstellen der p2.Site etc. (enthält .cspex .rmap und .cquery datei)

mein mail plugin ist nur das template nichts verändert.

die feature.xml des com.example.mail.product features hat als plugin das com.example.mail plugin und als feature das org.eclipse.rcp feature.

die .product Datei im com.example.mail.product feature basiert auf features und hat eine dependency zum feature in dem sie liegt (also com.example.mail.product)

Das com.example.mail.site Feature hat eine Depenency zum com.example.mail.product feature. Es enthält den build Ordner mit der Ant-Datei. Zusätzlich enthält es die site.cquery Datei, die resources.rmap Datei und die buckminster.cspex. Die Dateien sind dann eigentlich die aus dem Tutorial.

In Hudson selbst wird der Job erstellt:
- Namen angeben
- SVN/CVS angeben
- Shell hinzufügen um vor jedem Build buckminster.output und buckminster.temp zu löschen
- Run Buckminster hinzufügen, 1. TargetPlatform setzten 2. site.cspeq importieren 3. Action create.product ausführen
- Artifakte archivieren wie im Tutorial beschreiben

Dann sollte eigentlich alles funktionieren.
Wie gesagt Eclipse Newsgroup Forum gibt es 3 Beiträge in denen ich auch einige Probleme beschreibe und Wildcard mir bei deren Lösung geholfen hat.

Einfach mal durchlesen.
MFG


----------



## Wildcard (2. Dez 2009)

> jetzt kommt aber das total verwirrende:
> ich hab die anwendung von den ort aus gestartet wo sie von buckminster hin gebaut wurde... und dort wurde das plugin installiert... d.h. meine kopie aufm desktop hat das plugin in das orginal installiert... auch die anzeige der installierten plugins bezieht sich auf das orginal...


Das ist kein Buckminster Problem, sondern der p2 Director. In dem Ant Script das die Director Application ansteuert musst du das Roaming Property setzen:
Equinox p2 director application - Eclipsepedia


----------



## thomet (3. Dez 2009)

Super das ist eigentlich alles was ich zu diesem thema benötige.. ihr habt mir echt geholfen... großes DANKE an euch beide...

jetzt noch ne kleine frage .. wie ist das mit buckminster und der customBuildCallbacks.xml in den plugins.. werden diese trozdem ausgeführt?? ich habe den eindruck nicht.. oder muss dazu erst wieder eine option gesetzt werden??? (in der customBuildCallbacks.xml sind wichtige schritte die ausgeführt werden müssen) ....
und dann habe ich bei meinen pde build vorher noch immer in den about.mappings die build id automatisch ersetzt.. wie kann das jetzt bei buckminster realisiert werde??? (wenn customBuildCallbacks funktioniert dann könnte ich es hier machen) ..

mfg


----------



## thomet (3. Dez 2009)

ok in sachen about.mappings hab ich folgendes gefunden


```
<?xml version="1.0" encoding="UTF-8"?>
<cspecExtension
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:bc="http://www.eclipse.org/buckminster/Common-1.0"
	xmlns="http://www.eclipse.org/buckminster/CSpec-1.0">
	<artifacts>
		<private name="raw.about.mappings">
			<path path="about.mappings"/>
		</private>
	</artifacts>
	<actions>
		<private name="about.mappings" actor="ant">
			<actorProperties>
				<property key="buildFileId" value="buckminster.pdetasks"/>
				<property key="targets" value="replaceToken"/>
			</actorProperties>
			<properties>
				<property key="token" value="@build@"/>
				<property key="value" value="${build.id}"/>
			</properties>
			<prerequisites>
				<attribute alias="action.input" name="raw.about.mappings"/>
			</prerequisites>
			<products alias="action.output" base="${buckminster.output}/temp/">
				<path path="about.mappings"/>
			</products>
		</private>
	</actions>
	<groups>
		<private name="bin.includes">
			<attribute name="bin.includes.wo.about.mappings"/>
			<attribute name="about.mappings"/>
		</private>
	</groups>
	<alterArtifacts>
		<rename oldName="bin.includes" newName="bin.includes.wo.about.mappings"/>
		<private name="bin.includes.wo.about.mappings">
			<removePath path="about.mappings"/>
		</private>
	</alterArtifacts>
</cspecExtension>
```

jedoch ist ${build.id} nicht gesetzt^^ ...



und was auch noch sehr wichtig ist.. wie kann ich an der stelle "post.@dot" mit buckminster nan antscript ausführen??


----------



## Wildcard (5. Dez 2009)

> jetzt noch ne kleine frage .. wie ist das mit buckminster und der customBuildCallbacks.xml in den plugins..


Der Sinn der Sache ist das genau diese Callback Scripte nicht mehr benötigt werden. Nein, sie werden nicht ausgeführt und nicht benötigt. Was möchtest du denn darin tun?



> und dann habe ich bei meinen pde build vorher noch immer in den about.mappings die build id automatisch ersetzt.. wie kann das jetzt bei buckminster realisiert werde?


Was für einen Qualifier möchtest du denn verwenden? Buckminster unterstützt AFAIR timestamp, last modified und revision number (bei Subversion).



> und was auch noch sehr wichtig ist.. wie kann ich an der stelle "post.@dot" mit buckminster nan antscript ausführen??


Es gibt keine Callbackscripte, also auch kein post.@dot. Was möchtest du tun? Du willst etwas ausführen nachdem dein Produkt gebaut wurde? Mach einfach eine neue Action die dein Produkt als Action Input bekommt.


----------



## thomet (7. Dez 2009)

Wildcard hat gesagt.:


> Was für einen Qualifier möchtest du denn verwenden? Buckminster unterstützt AFAIR timestamp, last modified und revision number (bei Subversion).


ich möchte einfach den timestamp des aktuellen builds.



Wildcard hat gesagt.:


> Es gibt keine Callbackscripte, also auch kein post.@dot. Was möchtest du tun? Du willst etwas ausführen nachdem dein Produkt gebaut wurde? Mach einfach eine neue Action die dein Produkt als Action Input bekommt.


ich möchte nach dem builden und vor dem packen obfuscaten. dies hab ich an der stelle post.@dot bis jetzt gemacht in dem ich ein bestimmtes antscript aufgerufen habe. wie ich das genau in buckminster machen kann weiß ich nocht net. aber werds schon noch raus bekommen 

danke für die hilfe...


----------



## Wildcard (7. Dez 2009)

> ich möchte einfach den timestamp des aktuellen builds.


Ich glaube das Property heißt generator.timestamp müsste ich aber zu Hause nochmal nachschauen.



> ich möchte nach dem builden und vor dem packen obfuscaten. dies hab ich an der stelle post.@dot bis jetzt gemacht in dem ich ein bestimmtes antscript aufgerufen habe. wie ich das genau in buckminster machen kann weiß ich nocht net. aber werds schon noch raus bekommen


Du würdest einfach eine neue Action auf dem Feature auf dem du site.p2 aufrufst definieren (über eine cspex). Der Actor für die Action wäre zB Ant. Der Input (prerequistes) ist site.p2 und du nennst das Ding zB site.p2.obfuscated. Im Ant Script lässt du dann deinen Obfuscator auf die jars die in site.p2 generiert wurden los und kopierst sie an die Output Location der Action.
Die create.product Action bekommt nun als prerequiste site.p2.obfuscated anstatt wie bisher site.p2.


----------



## thomet (7. Dez 2009)

ok das werd ich so mal versuchen.. jetzt hab ich ma noch fragen zum thema update allgemein.... erstma hier die symbolisierte struktur meiner anwendung:






so nun ändere ich zb an dem plugin com.myapp.core.view etwas .. setzte die version von com.myapp.core.feture eins hör... lass nun mit buckminster die site generieren.. lade sie hoch .. und meine anwendung erkennt auch das eine neue version vorhanden ist..
nun kommt aber folgende meldung:


```
Your original request has been modified.
  "Core Feature" is already installed, so an update will be performed instead.
Cannot complete the install because of a conflicting dependency.
  Software being installed: Core Feature 1.0.1.r15514 (com.myapp.core.feature.feature.group 1.0.1.r15514)
  Software currently installed: MyApp 1.0.0.r15514 (myappProduct 1.0.0.r15514)
  Only one of the following can be installed at once: 
    Core Feature 1.0.0.r15514 (com.myapp.core.feature.feature.jar 1.0.0.r15514)
    Core Feature 1.0.1.r15514 (com.myapp.core.feature.feature.jar 1.0.1.r15514)
  Cannot satisfy dependency:
    From: MyApp 1.0.0.r15514 (myappProduct 1.0.0.r15514)
    To: com.myapp.product.feature.feature.group [0.0.1,2.0.0)
  Cannot satisfy dependency:
    From: Core Feature 1.0.0.r15514 (com.myapp.core.feature.feature.group 1.0.0.r15514)
    To: com.myapp.core.feature.feature.jar [1.0.0.r15514]
  Cannot satisfy dependency:
    From: Core Feature 1.0.1.r15514 (com.myapp.core.feature.feature.group 1.0.1.r15514)
    To: com.myapp.core.feature.feature.jar [1.0.1.r15514]
  Cannot satisfy dependency:
    From: MyApp Feature 1.0.0.r15514 (com.myapp.product.feature.feature.group 1.0.0.r15514)
    To: com.myapp.core.feature.feature.group [1.0.0.r15514]
```

ich hab auch noch folgende einträge gemacht in der p2.inf bei der product-Datei:


```
requires.1.namespace = org.eclipse.equinox.p2.iu
requires.1.name = com.myapp.langde.feature.feature.group
requires.1.range = [0.0.1,2.0.0)

requires.2.namespace = org.eclipse.equinox.p2.iu
requires.2.name = com.myapp.core.feature.feature.group
requires.2.range = [0.0.1,2.0.0)

requires.3.namespace = org.eclipse.equinox.p2.iu
requires.3.name = com.myapp.prereq.feature.feature.group
requires.3.range = [0.0.1,2.0.0)
```

dies hab ich hier her Andrew Niefer: Composing and updating custom Eclipse distros

könnt ihr mir dabei helfen ?? was mach ich falsch... irgendwie blick ich da net ganz durch

danke mfg thomas


----------



## Wildcard (7. Dez 2009)

Soweit ich mich erinnere ist es bei Eclipse derzeit nicht möglich included Features zu updaten (ich weiß, reichlich bescheurt, historisch bedingt). Du müsstest das äussere Feature updaten, oder auf included Features verzichten.


----------



## thomet (8. Dez 2009)

d.h. ich würde alles was in com.myapp.product.feature included ist... in das myapp.product zu packen... das myapp.product auf com.myapp.core.feature, com.myapp.prereq.feature und auf com.myapp.langde.feature zeigt...

das com.myapp.product.feature würde wech fallen...

und mach ich das dann trozdem mit dem com.myapp.site.feature... über das ich dann die updatesite erstelle?????


----------



## thomet (8. Dez 2009)

ok ich hab das jetzt ma gemacht.. das prob iss .. buckminster mäckert in der console gleich rum.. weil im site feature gleiche sachen sind wie im product (product-Datei liegt mit beim site feature. da dort auch der build erstellt wird siehe oben das thema) ...

nun hab ich folgendes gemacht... im product sind core + prereq + langde ... im site dann noch die anderen sprachen die mann dann zb updaten kann...

ich weiß net wirklich ob das so richtig ist..... ich find das irgendwie sehr verwirrend wie das gelöst ist.... jetzt test ich mal ob das dann mit dem updaten geht.. wenn ich dann ein feature und nen enthaltenes plugin hochzähle ....


----------



## thomet (8. Dez 2009)

ok.. also es scheint jetzt nach ein paar tests zu funktionieren.... 

da ich meine sources ja nicht mit veröffentlichen möchte hab ich in meine buckminster.properties folgendes eingetragen..

```
cbi.include.source=false
```

das funktioniert auch soweit für alles plugins/features.. jedoch ist mir nun noch eins aufgefallen...

wenn ich in meinen updatemanager den hacken in sachen gruppierung wech mache.. erscheinen folgende zwei dinge
- com.myapp.site.feature
- com.myapp.site.feature.source

diese sollten aber eigentlich nicht vorhanden sein .. (laut dem ganz oben genanten tutorial) .. dies ist ja nur das feature für die site?!

bei einem anderen projekt iss das komischerweiße nicht der fall, der unterschied ist nur.. das in diesem feature (com.myapp.site.feature) auch die MyApp.product enthalten ist und die buckminster.cspex welches es dann möglicht macht ein product build mit buckminster durch zu führen.

im com.myapp.site.feature ruf ich über buckminster p2.site auf .. doch das feature was eigentlich nur die site bestimmt.. ist selber in der site integriert ????


----------



## Wildcard (8. Dez 2009)

Ich mache üblicherweise folgendes:
ein releng Feature (das nicht ausgeliefert wird) in dem die .product liegt. Dieses Feature enthält alle Features die ich im Produkt habe will. Das .product zeigt auf die gleichen Features. Dann wird aus dem Releng Feature site.p2 gebaut und das dient als Input für den p2 Director.
Das MailApp Beispiel zeigt den Aufbau.


----------



## thomet (9. Dez 2009)

ja genau so hatte ich das ja... nur kam dann von buckminster folgende meldung:


```
Project refresh on com.myapp.site.feature failed: CSpec com.myapp.site.feature, attribute feature.references already has a prerequisite named com.myapp.core.feature:eclipse.feature#feature.jars
```

releng/site plugin





MyApp.product





feature


----------



## thomet (9. Dez 2009)

nochma zum thema about.mappings:

ich wollte nun in meine aboutDialog den BuildTimeStamp anzeigen lassen...

ich hab folgendes versucht:

buckminster.properties

```
...
build.id=generator:buildTimestamp
...
```

und hab dann wie vorher ma beschrieben mein token durch ${build.id} ersetzen lassen..

klang ja erstma ganz gut... 

DOCH: im aboutDialog steht net der timestamp sondern "generator:buildTimestamp" kp warum?!


----------



## Wildcard (9. Dez 2009)

Einfach im Ant Script mal echoproperties einbauen damit du siehst was du alles zur Auswahl hast.
Dort findest du dann zB:

```
generator.buildTimestamp.format=2009-12-09T11\:56\:10.296+0000
```


----------



## thomet (10. Dez 2009)

Wildcard hat gesagt.:


> Du würdest einfach eine neue Action auf dem Feature auf dem du site.p2 aufrufst definieren (über eine cspex). Der Actor für die Action wäre zB Ant. Der Input (prerequistes) ist site.p2 und du nennst das Ding zB site.p2.obfuscated. Im Ant Script lässt du dann deinen Obfuscator auf die jars die in site.p2 generiert wurden los und kopierst sie an die Output Location der Action.
> Die create.product Action bekommt nun als prerequiste site.p2.obfuscated anstatt wie bisher site.p2.



also .. nochma kurz zum thema obfuscating. ich hab es wie du beschrieben hast eingebaut. funktioniert soweit auch erstma. jedoch !!

da die site.p2 vor dem obfuscating gebaut wird... erhalten ich beim erstellen des products md5 fehler

```
[ant]   MD5 hash is not as expected. Expected: 05530233ebd7c40e7315e4f1ebc2e737 and found ed5e4365c97f61c3f9a1d6c09406f5ad.
[ant]  Problems downloading artifact: osgi.bundle,com.myapp.core.db,1.0.0.r15398.
```

mein versuch war dann anstelle site.p2 die copy.plugins als prerequistes zu nehmen... was wiederrum auch klappt.. doch die site.p2 action die danach aufgerufen wird.. ersetzt meine plugins komischerweiße wieder durch die orginalen?!


----------



## thomet (10. Dez 2009)

soo ich hab nun zum obfuscating eine lösung gefunden:


```
<?xml version="1.0" encoding="UTF-8"?>
<cspecExtension
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:bc="http://www.eclipse.org/buckminster/Common-1.0"
	xmlns="http://www.eclipse.org/buckminster/CSpec-1.0">

    <actions>
        <public name="site.p2.obfuscated" actor="p2SiteGenerator">
            <prerequisites>
            	<attribute name="feature.exports" alias="site" filter="(&amp;(!(site.pack200=true))(!(site.signing=true)))"/>
                <attribute name="plugin.obfuscating" alias="site"/>
                <attribute name="site.packed" alias="site" filter="(site.pack200=true)"/>
                <attribute name="site.signed" alias="site" filter="(&amp;(site.signing=true)(!(site.pack200=true)))"/>
                <attribute name="MyAppProduct" alias="site.definer"/>
                <attribute name="product.configuration.exports" alias="product.configs"/>
            </prerequisites>
            <products base="${buckminster.output}/site.p2/"/>
        </public>
        <private name="plugin.obfuscating" actor="ant">
	        <actorProperties>
	            <property key="buildFile" value="build/obfuscate.ant"/>
	            <property key="targets" value="site.p2.obfuscated"/>
	        </actorProperties>
	        <products base="${buckminster.output}/site/"/>
	    </private>
        <public name="create.product.obfuscated" actor="ant">
	        <actorProperties>
	            <property key="buildFile" value="build/product.ant"/>
	            <property key="targets" value="create.product"/>
	        </actorProperties>
	        <properties>
	            <property key="profile" value="MyAppProfile"/>
	            <property key="iu" value="MyAppProduct"/>
	        </properties>
	        <prerequisites>
	            <attribute name="site.p2.obfuscated" alias="repository"/>
	        </prerequisites>
	        <products alias="destination" base="${buckminster.output}">
	            <path path="MyApp/"/>
	        </products>
	    </public>
	    <public name="create.product.obfuscated.zip" actor="ant">
	        <actorProperties>
	            <property key="buildFileId" value="buckminster.pdetasks"/>
	            <property key="targets" value="create.zip"/>
	        </actorProperties>
	        <prerequisites alias="action.requirements">
	            <attribute name="create.product.obfuscated"/>
	        </prerequisites>
	        <products alias="action.output" base="${buckminster.output}">
	            <path path="MyApp.zip"/>
	        </products>
        </public>
    </actions>
</cspecExtension>
```

ich weiß zwar nocht ob das die beste bzw eine gute ist.. aber sie funktioniert  ....

mfg


----------



## Wildcard (10. Dez 2009)

Richtig... ich hatte vergessen das ein p2 Repository Checksummen prüft. Schön das du trotzdem eine Lösung gefunden hast.


----------

