¿Cómo construyo una aplicación Eclipse RCP para que sus características se puedan actualizar automáticamente?
eclipse-plugin eclipse-rcp (3)
Antes de encontrar la respuesta que está documentada aquí y aceptada, intenté y no pude resolver este problema de las siguientes maneras:
Intenté poner la característica 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. Se parece a esto...
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);//
Intenté agregar una línea como esta para instalar esa característica, pero mi build tycho falla cuando ejecuto mvn clean install
instructions.configure=/
org.eclipse.equinox.p2.touchpoint.eclipse.installFeature(feature:My Feature Name,featureId:com.my.domain.my.feature.id,version:1.0.0);
Aquí hay algunos de los mensajes de error de maven / 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 dice que a mi complemento de la aplicación RCP le falta algo que le dirá a p2 dónde encontrar la característica que deseo instalar en tiempo de compilación. ¿¿¿Creo???
Estoy construyendo una aplicación RCP que estará compuesta de varias características.
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 forma automatizada para tener una característica instalada en una aplicación RCP de tal manera que se actualice independientemente de otras características, y no requiere que el usuario de la aplicación RCP la instale a mano.
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, simplemente 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, consulte esta página de documentación .
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.
Usé la lista de correo p2-dev, y Paul Webster respondió mi pregunta. (Gracias Paul)
Sugirió usar ant para iniciar la aplicación del director p2 para instalar la IU en mi aplicación RCP construida.
Esta es su respuesta en la lista de correo de p2-dev http://dev.eclipse.org/mhonarc/lists/p2-dev/msg04735.html
Aquí está el objetivo de la hormiga que se 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 a través de Tycho. Tycho produce mis artefactos de construcción en un directorio llamado "destino", por lo que mis parámetros para el objetivo anterior se ven así ...
<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 algunos más de estos objetivos para cada plataforma para la que está diseñada mi aplicación RCP.
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 de una manera mucho más simple. . Entonces, la nueva respuesta aceptada es la solución adecuada para esta pregunta ahora.