2013-02-25 19 views
5

Ho creato un'applicazione Eclipse RCP (Indigo) con Tycho. La build viene eseguita su una macchina Win 7, a 64 bit.La distribuzione Mac dell'applicazione Eclipse RCP creata con Tycho su Windows non viene avviata

Il POM genitore comprende:

<plugin> 
    <groupId>org.eclipse.tycho</groupId> 
    <artifactId>target-platform-configuration</artifactId> 
    <version>${tycho-version}</version> 
    <configuration> 
    <resolver>p2</resolver> 

    <environment> 
    <os>linux</os> 
    <ws>gtk</ws> 
    <arch>x86_64</arch> 
    </environment> 
    <environment> 
    <os>win32</os> 
    <ws>win32</ws> 
    <arch>x86_64</arch> 
    </environment> 
    <environment> 
    <os>macosx</os> 
    <ws>cocoa</ws> 
    <arch>x86_64</arch> 
    </environment> 

... 

La configurazione di prodotto si presenta così (con alcune omissioni e la linea in più pause per readbility):

<product name="My App" uid="myapp.product" id="myapp.core.product" application="myapp.core.application" version="0.1.4.qualifier" useFeatures="true" includeLaunchers="true"> 

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

    <launcherArgs> 
     <programArgs>-data @noDefault</programArgs> 
     <vmArgsMac>-XstartOnFirstThread 
         -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac> 
    </launcherArgs> 

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

    <vm> 
     <macos include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6</macos> 
    </vm> 

    <plugins> 
     <plugin id="com.ibm.icu"/> 
     <plugin id="myapp.core"/> 
     <plugin id="org.eclipse.core.runtime"/> 
     <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/> 
     <plugin id="org.eclipse.equinox.app"/> 
     <plugin id="org.eclipse.equinox.common"/> 
     <plugin id="org.eclipse.osgi"/> 
     <plugin id="org.eclipse.swt"/> 
     <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/> 
     <plugin id="org.eclipse.ui"/> 
     <plugin id="org.eclipse.ui.workbench"/> 
    </plugins> 

    <features> 
     <feature id="org.eclipse.rcp" version="3.7.2.v20120120-1424-9DB5FmnFq5JCf1UA38R-kz0S0272"/> 
     <feature id="myapp.platform_dependencies.feature" version="0.1.4.qualifier"/> 
     <feature id="myapp.core.feature" version="0.1.4.qualifier"/> 
     <feature id="myapp.ui.feature" version="0.1.4.qualifier"/> 
     <feature id="myapp.model.feature" version="0.1.4.qualifier"/> 
    </features> 

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

</product> 

La build funziona senza problemi, e genera file zip, che, scompattato sui SO di destinazione Windows & Linux include i lanciatori funzionanti. (Su Linux, devo rendere eseguibile lanciatore prima di essere in grado di eseguirlo.)

In Mac OS X (10.6.8), tuttavia, il lanciatore (myapp.app) non fa nulla ...

Quando eseguo java -jar -XstartOnFirstThread plugins/org.eclipse.equinox.launcher_[version], l'applicazione viene avviata, anche se senza la schermata iniziale.

Immagino di avere un'impostazione sbagliata in qualsiasi punto della mia configurazione prodotto, ma non mi interessa quale.

+0

Devo aggiungere che sto usando il repo Indigo p2 piuttosto che una piattaforma di destinazione locale nella build. –

+0

Una nota ai nuovi utenti di .app come me: 'myapp.app' è in realtà una cartella e l'impostazione del bit eseguibile per questa cartella, a meno che non venga eseguita in modo ricorsivo, non cambierà nulla. Il file di avvio effettivo si trova all'interno di questa cartella in * myapp.app/Contents/MacOS/myapp *, e l'impostazione del bit eseguibile per questo file ('chmod + x myapp') farà il trucco e renderà l'eseguibile dell'app (a) eseguendo questo file dalla riga di comando (da * myapp.app/Contents/MacOS/* con './myapp'), (b) facendo doppio clic su * myapp.app/Contents/MacOS/myapp *, o (c) facendo doppio clic su * myapp.app * stesso (nel Finder) –

risposta

3

Non è previsto che la build multipiattaforma su Windows per Mac funzioni. La ragione è che Tycho/p2 avrebbe bisogno di simulare un file system con permessi Unix. C'è uno request for this nel tracker dei problemi di Tycho, ma IMHO implementarlo non vale la pena.

+0

Ho letto il bug report e, a questo punto, non contribuirò alla discussione un'implementazione della funzionalità bit eseguibile per Windows è utile o no (sono comunque abbastanza agevole da OS), ma puoi confermare che spostare la build su, ad esempio, Linux risolverà questo problema? –

+2

Sì, i build cross-platform con Tycho funzionano se la macchina di compilazione è un sistema * nix. – oberlies

1

Ho appena capito come rendere eseguibile OSX .app da Windows.

È possibile impostare il build di Tycho per generare file .tar.gz per Mac/Linux, quindi utilizzare uno strumento per impostare i permessi sull'eseguibile all'interno del file tar, poiché tar supporta le autorizzazioni * nix.

Ecco uno snippet che mostra come impostarlo in un file pom.xml. (Questo frammento configura anche la cartella Mac .app e aggiunge la versione ai nomi dei file di archivio): http://snipt.org/Aggid3

Ecco una classe Java che esegue il bit delle autorizzazioni. Richiede Guava e Apache Commons Compress: http://snipt.org/Aggic1

Ecco un barattolo precompilati incluse tutte le dipendenze: https://mega.co.nz/#!WcNjyRjS!KE7tM1xYrt1l9JIguUAsrgpLe2V0NS1QIj_NvdAnm88

Un esempio di utilizzo utilizzando il sopra sarebbe: java-jar gztperms.jar “Il mio prodotto- 0.0.1.201309091838-macosx.cocoa.x86.tar.gz "" My Product-Executable-0.0.1.201309091838-macosx.cocoa.x86.tar.gz "" My Product.app/Contents/MacOS/My Product "

Ho uno script post-build abbastanza semplice da eseguire da Jenkins che trova il file .gz e su cui gira questo script, e sempre ora funziona con il collegamento artefatto.