tutorial repositorio que proyecto español crear agregar maven eclipse-plugin tycho

repositorio - maven tutorial español



Tycho: creación de un repositorio p2 mediante la resolución de características de un repositorio Maven (1)

Intento crear un repositorio p2 a partir de los artefactos de características de Tycho que se implementan en un repositorio Maven remoto, sin tener que instalar los artefactos primero en el repositorio local Maven (como en Tycho no se puede resolver la referencia de producto a eclipse-función de un construcción de reactor diferente ), y sin tener que construir todas las características y el repositorio juntos en una construcción de reactor único.

Fondo

Tengo un proyecto Tycho de varios módulos que construye varios complementos y características de Eclipse.

Para poder compilar cada módulo por separado y para poder hacer referencia a los artefactos OSGI en nuestro repositorio Nexus Maven, he habilitado <pomDependencies>consider</pomDependencies> en mi plataforma de destino y he agregado dependencias Maven entre los módulos o el repositorio. artefactos como de costumbre con elementos <dependency/> .

Esto funciona bien: puedo crear las características o ejecutar las pruebas de complemento sin que sus complementos dependientes estén en mi repositorio local de Maven o en la misma compilación del reactor. Por ejemplo, cuando mvn test en un proyecto de prueba de complemento, las dependencias relevantes se descargarán de Nexus y Tycho resolverá felizmente los s de Import-Package en mi manifiesto contra estos, creará todo y ejecutará las pruebas. Hasta aquí todo bien.

Me gustaría generar un repositorio p2 a partir de estas características para que pueda instalarlas en Eclipse desde un sitio de actualización, y la forma anunciada de hacerlo es con el tipo de empaque eclipse-repository . Pero aquí el plan se cae: Tycho no parece ser capaz de resolver dependencias de características cuando construye repositorios de la misma manera que puede resolver dependencias de complementos cuando construye características. Todos los intentos producen:

[ERROR] Cannot resolve project dependencies: [ERROR] Software being installed: my.eclipse.repository raw:0.0.1.''SNAPSHOT''/format(n[.n=0;[.n=0;[-S]]]):0.0.1-SNAPSHOT [ERROR] Missing requirement: my.eclipse.repository raw:0.0.1.''SNAPSHOT''/format(n[.n=0;[.n=0;[-S]]]):0.0.1-SNAPSHOT requires ''my.prj.eclipse.project.feature.feature.group 0.0.0'' but it could not be found

Hay dos formas en que he creado con éxito el repositorio p2:

  • Como parte de la construcción del mismo reactor . Si hago del eclipse-repository un módulo dentro del proyecto Tycho multi-module, y construyo todo el proyecto a la vez con, por ejemplo, mvn verify , las características se resuelven bien. Pero no quiero hacer esto. Preferiría construir módulos individualmente. Esto significa que nuestra IC puede tener un indicador para cada módulo, y podemos ver inmediatamente en qué fallaron las pruebas del módulo; nos da oportunidades para construir en paralelo; y evitamos tener que ejecutar constantemente compilaciones en módulos que no han cambiado. Sería una pena tener que usar una construcción monolítica de Maven.
  • Si instalo el proyecto Tycho en mi repositorio Maven local , mvn install en la dependencia. Pero tampoco quiero hacer esto, porque esto significaría que la creación es inherentemente irreproducible, ya que sería sensible al estado del repositorio local. Nuestro CI actualmente está configurado para mantener un repositorio de Maven por trabajo y para borrarlo por completo al inicio de la ejecución, para protegernos de este potencial desorden.

Entonces mi pregunta es: ¿hay una tercera forma? ¿Hay alguna manera de que el plugin de Tycho responsable de crear paquetes de eclipse-repository descargue características de un repositorio remoto de Maven? O de otra forma, ¿puedo construir el repositorio p2 a partir de complementos que se hayan construido e implementado individualmente en el repositorio Maven?

Las cosas que he intentado incluyen:

  • Especificando las dependencias de características de Maven como jar y eclipse-feature
  • agregando explícitamente las características a la plataforma objetivo, como

    ... <artifactId>target-platform-configuration</artifactId> <version>${tycho.version}</version> <configuration> <dependency-resolution> <extraRequirements> <requirement> <type>eclipse-feature</type> <id>my.prj.eclipse.project.feature</id> <versionRange>0.0.0</versionRange> </requirement> ...

Lo más cercano que he encontrado a una solución decente es tener un proyecto Tycho de múltiples módulos que solo contenga el repositorio y las características.

feature-project |- feature1 (eclipse-feature) |- feature2 (eclipse-feature) |- repository (eclipse-repository)

Construir esto funciona : todos los complementos agregados al POM de nivel superior se descargan de Nexus, están disponibles para su inclusión en cada característica y se incluyen en el repositorio generado.

Sin embargo, esto está lejos de ser ideal porque ya no puedo almacenar mis características lógicamente junto con mis complementos; necesitan estar en jerarquías de proyecto separadas. Intentando construir las características y el repositorio por separado, como con mvn clean verify -pl :feature1,feature2,repository , falla presumiblemente debido a Bug 380152 .

¿Hay una mejor manera? Cualquier ayuda sería recibida con gratitud.

Muchas gracias

(Como un aparte: construir el repositorio con mvn clean verify -Dtycho.localArtifacts=ignore tendrá éxito si las características están presentes en el repositorio Maven local, y no le mostrará la advertencia de que los artefactos se están resolviendo desde el repositorio local. . ¿Es esto un error?


Estoy muy impresionado por su análisis exhaustivo. Casi tiene todo cubierto, lo que es posible con la versión actual de Tycho (0.22.0), excepto por la solución que es tan poco intuitiva que no esperaba que nadie pudiera adivinarla (ver más abajo). Sin embargo, tenga en cuenta que se necesita una pequeña corrección para que la solución funcione también para los artefactos SNAPSHOT.

Pero primero, me gustaría proporcionar algunos antecedentes técnicos (e históricos) de lo que ha observado:

pomDependencies = consider only works for plug-ins : el caso de uso para esta funcionalidad fue permitir el uso de complementos de referencia (o más precisamente paquetes OSGi) de repositorios Maven. Entonces, cuando se establece el indicador y el proyecto tiene dependencias con JAR, Tycho comprobará si son paquetes OSGi, generará los metadatos p2 para ellos sobre la marcha y los agregará a la plataforma objetivo. No existe un soporte similar para los JAR de características porque estos generalmente no existen en los repositorios de Maven.

Pero, ¿qué hay de los proyectos construidos por Tycho? ¡Estos pueden implementarse en los repositorios de Maven! Sí, esto es cierto, y es por eso que traté de extender el concepto pomDependencies para permitir lo que estás tratando de hacer. La idea era que cada vez que Tycho considera una dependencia de POM para la plataforma de destino, también verifica si existen los archivos de índice p2 ...-p2metadata.xml y ...-p2artifacts.xml . Sin embargo, esto resultó para inferir una penalización de rendimiento masivo porque generalmente lleva mucho tiempo para que un servidor de repositorio de Maven descubra que un artefacto no existe. Por lo tanto, la descarga remota se deshabilitó y se reemplazó por una búsqueda en el repositorio local de Maven. De esta forma, dos compilaciones de Tycho podrían establecer -Dtycho.localArtifacts=ignore y aún así poder intercambiar los artefactos especificados en el POM a través del repositorio local de Maven.

Conociendo estos detalles de implementación, llegamos a la siguiente solución: en lugar de solo agregar una dependencia de POM desde el repositorio al artefacto de características, también necesita agregar dependencias a los archivos p2metadata y p2artifacts. Ejemplo:

<dependencies> <dependency> <groupId>myproject</groupId> <artifactId>myproject.feature</artifactId> <version>0.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>myproject</groupId> <artifactId>myproject.feature</artifactId> <version>0.1.0-SNAPSHOT</version> <classifier>p2metadata</classifier> <type>xml</type> </dependency> <dependency> <groupId>myproject</groupId> <artifactId>myproject.feature</artifactId> <version>0.1.0-SNAPSHOT</version> <classifier>p2artifacts</classifier> <type>xml</type> </dependency> </dependencies>

Esto hace que Maven también descargue estos archivos de índice p2, por lo que Tycho reconoce el artefacto principal como artefacto Tycho. De esta forma, también puede obtener una característica de eclipse en la plataforma de destino a través de dependencias POM, al menos casi: con 0.22.0, la compilación del depósito pasa, pero falta el artefacto feature.jar. Ya depuré este problema, y ​​es fácil de arreglar .

Obviamente, la sintaxis con tres elementos de <dependency> para cada dependencia real no es agradable. Debería ser posible reducir esto a un solo elemento p2artifacts , pero esto es más trabajo. En caso de que esté interesado en esta función, puede abrir una solicitud de mejora en el rastreador de problemas de Tycho .