2012-04-27 16 views
6

Estoy construyendo una aplicación RCP que estará compuesta de varias características.¿Cómo construyo una aplicación Eclipse RCP para que sus características se puedan actualizar automáticamente?

Mi aplicación RCP está configurada para buscar actualizaciones cada vez que se inicia. Mi problema actual es que necesito que una de mis características esté 'Instalada' en el momento de la compilación para que se actualice durante esta comprobación automática de actualizaciones sin obligar al usuario a instalarla manualmente. Necesito esta característica para actualizar independientemente de las otras características en el sistema.

Por lo tanto, para recapitular, solo estoy buscando una buena manera automática de tener una característica instalada en una aplicación RCP de tal manera que se actualice independientemente de otras características, y no requiera del usuario del RCP aplicación para instalarlo manualmente.

Respuesta

2

Mientras tanto, Tycho tiene soporte explícito para este caso de uso. Comenzando con Tycho 0.20.0, puede hacer que Tycho instale características de un RCP por separado del producto. De esta forma, estas características se pueden actualizar (o incluso desinstalar) independientemente del producto.

Para instalar características de forma independiente, solo agregue un atributo installMode="root" a las etiquetas de características respectivas en el archivo del producto. Ejemplo:

<features> 
    <feature id="org.eclipse.platform"/> 
    <feature id="updatable.feature" installMode="root"/> 
</features> 

Para obtener más información, ver this documentation page.

+0

¿Dónde puedo encontrar este archivo .product? – Wearybands

5

Después de una larga búsqueda, encontré la respuesta. Es una especie de kludge, pero estoy dispuesto a hacer cualquier cosa en este punto. Mi solución depende del hecho de que mi aplicación RCP integrada incluye la aplicación p2 org.eclipse.equinox.p2.director. Supongo que si su aplicación RCP no contiene esta aplicación, puede consultar otra instalación de Eclipse para iniciar el Director. Lo hice de esta manera para evitar tener una instancia de Eclipse sentada en mi máquina de construcción.

Utilicé la lista de correo p2-dev, y Paul Webster respondió mi pregunta. (Gracias Paul)

Sugirió usar ant para iniciar la aplicación p2 director para instalar la IU en mi aplicación RCP construida.

He aquí su respuesta en la lista de correo p2-dev http://dev.eclipse.org/mhonarc/lists/p2-dev/msg04735.html

Ésta es la tarea ant me ocurrió.

<target name="install_IU"> 
    <path id="launcher.paths"> 
    <fileset 
     dir="${app.dir}" 
     includes="plugins/org.eclipse.equinox.launcher_*" /> 
    </path> 
    <property 
     name="launcherPath" 
     refid="launcher.paths" /> 
    <echo>-installIU ${iu.id} </echo> 
    <java 
     jar="${launcherPath}" 
     failonerror="false" 
     dir="${app.dir}" 
     timeout="900000" 
     fork="true" 
     output="${basedir}/director.log" 
     resultproperty="directorcode"> 
     <arg line="-application org.eclipse.equinox.p2.director" /> 
     <arg line="-noSplash" /> 
     <arg line="-installIUs ${iu.id}" /> 
     <arg line="-repository ${iu.repo}" /> 
     <arg line="-destination ${app.dir}" /> 
     <arg line="-bundlepool ${app.dir}" /> 
    </java> 

    <zip destfile="${app.zip}" 
    basedir="${app.dir}"/> 
</target> 

Puse esto en un archivo ant en el mismo proyecto que produce mi aplicación Eclipse RCP mediante Tycho. Tycho produce mis artefactos de construcción en un directorio llamado "objetivo" para que mis parámetros a la tarea ant por encima de aspecto como este ...

<target name="modify_x86"> 
    <antcall target="install_IU"> 
    <param name="iu.id" value="com.mydomain.the.feature.i.want.to.install.feature.feature.group"/> 
    <param name="iu.repo" value="http://mydomain.com/thep2repository/where/i/deploy/the/feature/to/install"/> 
    <param name="app.dir" value="${basedir}/target/products/com.mydomain.myRCPapplication/win32/win32/x86"/> 
    <param name="app.zip" value="${basedir}/target/products/com.mydomain.myRCPapplication-win32.win32.x86.zip"/> 
    </antcall> 
</target> 

tengo unos cuantos más de estos objetivos para cada plataforma que mi aplicación RCP se construye para.

Espero que esto ayude.

ACTUALIZACIÓN: 8 de mayo de 2014. Tobias me ha señalado que debería cambiar la respuesta aceptada de esta a la que tiene la nueva función que se agregó a Tycho 0.20.0 que permite este comportamiento en una una forma mucho más simple. Entonces, la nueva respuesta aceptada es la solución adecuada para esta pregunta ahora.

+1

FYI, esta es la razón por la cual esto funciona: Primero, Tycho llama internamente a un director de p2 (incrustado) e instala el IU del producto. Luego, llama al director nuevamente e instala la característica IU. La instalación resultante tiene dos "IU raíz" (es decir, puntos de entrada que abarcan la instalación). Una verificación de actualizaciones comprobará cada IU raíz para las versiones más nuevas, para que su función se actualice cuando haya una versión más nueva disponible en los repositorios configurados. – oberlies

+0

Tengo buenas noticias: Tycho ahora tiene [soporte explícito para este caso de uso] (http://wiki.eclipse.org/Tycho/Release_Notes/0.20), por lo que probablemente pueda deshacerse de aproximadamente una milla de pom. configuración xml ;-) – oberlies

+0

Gracias, eliminé el antiguo código de la hormiga de arriba y aproveché la nueva función. Fui uno de los 18 votantes en el error :) https://bugs.eclipse.org/bugs/show_bug.cgi?id=361722 – twindham

1

Antes de encontrar la respuesta que se documenta aquí y aceptado, que intentó y no pudo resolver este problema de la siguiente manera:

He intentado poner la función en la definición del producto. Esta es la función instalada con éxito, pero me quita la posibilidad de actualizarla independientemente de otras características en la aplicación RCP.

Tengo un comando de punto de contacto p2 que está funcionando actualmente. Agrega un repositorio a los sitios de actualización disponibles en la aplicación RCP utilizando un archivo p2.inf. Parece que este ...

instructions.configure=\ 
org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(location:http${#58}//myUpdateSsite/myFeature,type:0,name:My Feature Name,enabled:true);\ 
org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(location:http${#58}//myUpdateSsite/myFeature,type:1,name:My Feature Name,enabled:true);\\ 

He intentado añadir una línea como esta para obtener esa característica instalada, pero mi Tycho generación falla cuando corro mvn instalación limpia

instructions.configure=\ 
org.eclipse.equinox.p2.touchpoint.eclipse.installFeature(feature:My Feature Name,featureId:com.my.domain.my.feature.id,version:1.0.0); 

He aquí algunos del mensaje de error del experto/Tycho

An error occurred while configuring the installed items session context was: 
(profile=DefaultProfile, phase=org.eclipse.equinox.internal.p2.engine.phases.Configure, operand=null --> 
[R]{my.domain.my.rcp.product.plugin 1.1.6.20120427-1346}, 
action=org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.InstallFeatureAction). 
Installable unit contains no artifacts: [R]my.domain.my.rcp.product.plugin 1.1.6.20120427-1346. 

mi intuición me dice que este mensaje de error está diciendo que mi plugin de aplicación RCP le falta algo que le dirá p2 dónde encontrar la característica que yo qui nt para instalar en tiempo de compilación. ¿¿¿Creo???

+0

¡Buen esfuerzo! Aún así, el punto de contacto 'installFeature' no puede funcionar aquí. Los puntos de contacto son la capa física (es decir, E/S de archivo) de p2. Necesita un cambio en los metadatos p2 de alto nivel de la instalación para lograr su objetivo. – oberlies

+0

Bueno, estoy de acuerdo en que los ejemplos anteriores no funcionan. Los dejo aquí para que otros que luchan con lo mismo puedan encontrarlo durante una búsqueda en la web. Realmente me gustaría aprender más sobre lo que p2 está haciendo aquí. Ha sido difícil averiguar cómo trabajar con p2 desde mi humilde opinión, no es muy intuitivo. Quiero aprender más ... entonces, ¿qué quiere decir con "Necesita un cambio en los metadatos p2 de alto nivel de la instalación"? OBTW, la respuesta que Paul Webster me dio está trabajando para mí, por lo tanto, no he estado buscando otras posibles soluciones recientemente. – twindham

+0

Se agregó más explicación en un comentario a la [solución de trabajo] (http://stackoverflow.com/a/10608982/1523648). – oberlies

Cuestiones relacionadas