La mejor manera de convertir proyectos java existentes en paquetes osgi

Tenemos muchos componentes de los cuales queremos modularizar solo unos pocos para empezar. ¿Se pregunta cuál es la mejor manera (en el contexto de mi entorno de compilación) de crear paquetes a partir de todos estos componentes?

Mi entorno: Java 6, Maven 2.2.1, Hudson

Tecnologías: Spring 3.0.5, WebSphere 7, Hibernate 3.2.x y la mayoría de apache commons.

Requisitos

  1. Modularice solo algunos componentes. El resto de los componentes pueden exportar todos los paquetes.
  2. Cuando se importa a eclipse, debería poder ver los paquetes de paquetes importados como dependencias en la ruta de compilación (mvn eclipse:eclipse no parece hacer esto)

preguntado el 03 de mayo de 12 a las 18:05

3 Respuestas

Comience cambiando solo las entradas MANIFEST.MF de modo que todos sus artefactos se conviertan en paquetes; obviamente, no funcionarán mágicamente, pero es un buen primer paso no destructivo.

Al usar el maven-bundle-plugin, asegúrese de configurar extensions y supportedProjectTypes ya que puede tener problemas con las compilaciones de CI, los repositorios de Maven y m2e fallan si el tipo de paquete es bundle (ver final).

Pruebe sus dependencias externas más riesgosas/principales desde el principio; por ejemplo, si está utilizando JPA para la persistencia, asegúrese de que el proveedor funcione en un entorno OSGi con su paquete de dominio y el controlador JDBC.

Si está migrando desde Java EE/spring, busque Karaf o Virgo. Pero si sus componentes son para sistemas integrados o no tienen dependencias externas, Felix o Equinox pueden ser suficientes (aunque consulte el pax-url proyecto si ese es el caso).

¿Valdría la pena editar su pregunta para que sea un poco más específica sobre el dominio o las tecnologías?


eclipse:eclipse solo genera que cuando el proyecto se configura por primera vez, los problemas del ciclo de vida de m2e pueden ser un poco molestos, pero es mucho mejor que usar el antiguo enchufe de eclipse.


Lo siguiente agregará entradas de manifiesto a sus artefactos existentes sin cambiarlos de ninguna otra manera. Le dice a los plugins estándar de maven jar y war que usen el MANIFEST.MF generado por maven-bundle-plugin.

Pon esto en el POM principal:

<pluginManagement>
<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.3.7</version>
    <extensions>true</extensions>
    <configuration>
        <archive>
            <addMavenDescriptor>true</addMavenDescriptor>
        </archive>
        <supportedProjectTypes>
            <supportedProjectType>jar</supportedProjectType>
            <supportedProjectType>war</supportedProjectType>
        </supportedProjectTypes>
        <instructions>
            <Built-By>${project.organization.name}</Built-By>
            <Bundle-Vendor>${project.organization.name}</Bundle-Vendor>
            <Bundle-ContactAddress>${project.organization.url}</Bundle-ContactAddress>
            <Bundle-Description>${project.description}</Bundle-Description>
            <Bundle-DocURL>${bundle.doc.url}</Bundle-DocURL>
            <Bundle-Category>${bundle.category}</Bundle-Category>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            <Bundle-Version>${project.version}</Bundle-Version>

            <Import-Package>*</Import-Package>
            <Export-Package>*</Export-Package>
        </instructions>
    </configuration>
    <executions>
        <execution>
            <id>bundle</id>
            <goals>
                <goal>manifest</goal>
            </goals>
            <phase>prepare-package</phase>
            <inherited>true</inherited>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
        <archive>
            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
</plugin>

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <executions>
        <execution>
            <id>create-war</id>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
            <inherited>true</inherited>
        </execution>
    </executions>
    <configuration>
        <archive>
            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
</plugin>
</pluginManagement>

Luego, en los POM secundarios, simplemente puede hacer:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
        </plugin>
        <!-- Below is mutually exclusive: Either jar or war plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Respondido 25 Jul 13, 07:07

Tengo dos opciones para ejecutar estos pocos paquetes 1) en Apache Felix integrado dentro de WAR 2) dentro de WAB - Aravind Yarram

He actualizado mi publicación con las tecnologías. ¿Has probado Tycho? - Aravind Yarram

Publicación muy informativa: el contenido de POM es especialmente útil, gracias earcam. Nota para los usuarios: debe comentar la sección maven-war-plugin si se ejecuta en un JAR, de lo contrario, el objetivo del paquete fallará. - KomodoDave

@earcam - Perfecto, gracias =) Usé perfiles para cada uno de jar,war en su lugar, ya que puedes especificar un BundleActivator diferente para cada tipo de esta manera. La configuración del complemento maven-war entró en el perfil de 'guerra'. Esto solo es necesario para nosotros porque estamos usando su código en un arquetipo parcial que se puede aplicar a un proyecto existente de cualquier tipo de paquete. - KomodoDave

maven.apache.org/archetype/archetype-models/… PS El resumen de lo que hace un arquetipo parcial es i. fusionar el archetype-resources/pom.xml con la del proyecto existente, y ii. Agregue al proyecto existente cualquier otro recurso que tenga en archetype-resources. Es muy útil para la funcionalidad de contenedor reutilizable, como la OSGi-fication que estamos discutiendo aquí. - KomodoDave

Eche un vistazo a bndtools, tiene un excelente soporte para crear proyectos que envuelven paquetes. Proporciona mucha información sobre cómo se estructuran los JAR y cómo dependen de otras cosas.

contestado el 04 de mayo de 12 a las 13:05

¿Bndtools mueve los archivos jar generados al repositorio maven automáticamente? o ¿cómo se pueden mover los frascos a mvn repo? - Syed Shahul

Bastante viejo ahora, pero probablemente valga la pena revelar su afiliación con bndtools: Flexografía

¿Por qué sería necesario? bndtools no es un producto? - Pedro Kriens

Utilice el Complemento de paquete maven. Agregará las declaraciones de importación y exportación requeridas a su manifiesto en función del escaneo de su código y las dependencias definidas en el archivo pom. Esto requerirá la menor cantidad de esfuerzo para convertir.

También te recomiendo que uses Eclipse M2 en lugar de mvn eclipse:eclipse. Mantendrá su configuración Maven y su espacio de trabajo sincronizados.

contestado el 03 de mayo de 12 a las 19:05

Es configurable, puede configurarlo para una instalación externa; podría funcionar con Maven2. Pero tendrá un kilometraje considerablemente mejor con m2e y maven-bundle-plugin - cámara auditiva

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.