Search code examples
eclipsemaventychoeclipse-rapupdate-site

Build single update-site for RAP and RCP flavored feature


I have a build for a single-sourced RCP/RAP Eclipse feature project that uses maven profiles to either build RAP or RCP bundles, fragments and features.

This works reasonably well. If I include my update site project as module in the above build's parent POM I can also easily build a platform-specific update-site using either "eclipse-update-site" (or "eclipse-repository") packaging.

However, I was wondering, if there is a way to

  1. build RCP target platform > publish to local repo
  2. build RAP target platform > publish to local repo
  3. run build for RCP (target platform from step 1) > publish to local repo
  4. run build for RAP (target platform from step 2) > publish to local repo
  5. run build for update site only, include feature for RAP and for RCP (not compiling anything, just assembling from 1+2)

I could successfully execute steps 1-4, but not 5, because Tycho was trying to resolve the features referenced by the category.xml with a different qualifier.

If I understand update sites/p2 repositories correctly, it should be possible to offer any artifacts / bundles / features in various flavors, right?

How can I solve this, or rather: can I have a single tycho build that runs the above build steps consecutively with the same qualifier for all?


Addendum: This existing question goes in the same direction and suggests to "install the (feature) Tycho project(s) into ... local Maven repository". That's actually what I'm doing when I run 1. and 2. after each other, specifiying the same local repo for both. But then 3. fails to pull the referenced artifacts from there, because the qualifier is different (two distinct reactor builds). Running everything in the same reactor build would be totally fine for me, but I think that's not possible, because there are different target platforms involved.

I think the solution there is pretty close to what I need, but I don't understand how my category.xml (or site.xml) and the extra dependencies in POM work together. Do I have to abandon category.xml altogether and respecify all my dependencies in the eclipse-repository POM?


My build roughly looks like this:

foo.releng/pom.xml (parent POM)

<?xml version="1.0" encoding="UTF-8"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <modelVersion>4.0.0</modelVersion>
    <groupId>net.bar</groupId>
    <artifactId>foo</artifactId>
    <version>0.31.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <tycho-version>1.0.0</tycho-version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jacoco-version>0.7.6.201602180812</jacoco-version>
    </properties>

    <modules>
        <module>../foo.plugin1</module>
        <module>../foo.plugin2</module>
        <!-- feature module is built depending on target platform, see below -->
    </modules>

    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-maven-plugin</artifactId>
                <version>${tycho-version}</version>
                <extensions>true</extensions>
            </plugin>
            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>target-platform-configuration</artifactId>
                <version>${tycho-version}</version>
                <configuration>
                    <!-- target and dependency-resolution are RAP/RCP dependent, see profiles below -->
                    <resolver>p2</resolver>
                    <environments>
                        <environment>
                            <os>win32</os>
                            <ws>win32</ws>
                            <arch>x86</arch>
                        </environment>
                        <environment>
                            <os>win32</os>
                            <ws>win32</ws>
                            <arch>x86_64</arch>
                        </environment>
                    </environments>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>target-rcp</id>
            <activation>
                <property>
                    <name>target.platform</name>
                    <value>rcp</value>
                </property>
            </activation>
            <modules>
                <module>../foo.fragment.rcp</module>
                <module>../foo.feature.rcp</module>
            </modules>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.eclipse.tycho</groupId>
                        <artifactId>target-platform-configuration</artifactId>
                        <version>${tycho-version}</version>
                        <configuration>
                            <target>
                                <artifact>
                                    <groupId>net.bar</groupId>
                                    <artifactId>net.bar.foo.target.rcp</artifactId>
                                    <version>${project.version}</version>
                                    <classifier>rcp</classifier>
                                </artifact>
                            </target>
                            <dependency-resolution>
                                <optionalDependencies>ignore</optionalDependencies>
                                <extraRequirements>
                                    <requirement>
                                        <type>eclipse-plugin</type>
                                        <id>org.eclipse.ui</id>
                                        <versionRange>0.0.0</versionRange>
                                    </requirement>

                                    ... more rcp-only dependencies

                                </extraRequirements>
                            </dependency-resolution>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>target-rap</id>
            <activation>
                <property>
                    <name>target.platform</name>
                    <value>rap</value>
                </property>
            </activation>
            <modules>
                <module>../foo.fragment.rap</module>
                <module>../foo.feature.rap</module>
            </modules>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.eclipse.tycho</groupId>
                        <artifactId>target-platform-configuration</artifactId>
                        <version>${tycho-version}</version>
                        <configuration>

                        ... same as for RCP above, but for RAP

                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

An this is the updatesite/category.xml

<?xml version="1.0" encoding="UTF-8"?>
<site>
   <feature url="features/net.bar.foo.feature.rcp_0.31.0.qualifier.jar" id="net.bar.foo.feature.rcp" version="0.31.0.qualifier">
      <category name="net.bar.rcp"/>
   </feature>
   <feature url="features/net.bar.foo.feature.rap_0.31.0.qualifier.jar" id="net.bar.foo.feature.rap" version="0.31.0.qualifier">
      <category name="net.bar.rap"/>
   </feature>
   <category-def name="net.bar.rcp" label="RCP">
      <description>
         RCP Platform Features
      </description>
   </category-def>
   <category-def name="net.bar.rap" label="RAP">
      <description>
         RAP Platform Features
      </description>
   </category-def>
</site>

And the updatesite/pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <version>0.31.0-SNAPSHOT</version>
        <relativePath>../foo.releng/pom.xml</relativePath>
        <artifactId>foo</artifactId>
        <groupId>net.bar</groupId>
    </parent>

    <artifactId>net.bar.foo.updatesite</artifactId>
    <packaging>eclipse-repository</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-packaging-plugin</artifactId>
                <version>${tycho-version}</version>
                <configuration>
                    <archiveSite>true</archiveSite>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Solution

  • This question which concerns a very similar problem helped me to find a solution.

    I succeded by configuring the tycho-packaging-plugin with a reproducible timestamp qualifier.

    By using a constant version qualifier (based on the git commit ID) for all of my consecutive builds, the final repository build could resolve all referenced feature bundles correctly in the local maven repo.

    After this adjustment the following build runs through without any problems and publishes a RAP and RCP feature flavor:

    # build rcp target
    
    cd foo/net.bar.foo.target.rcp
    mvn clean install -Dmaven.repo.local=../../m2
    
    # build rap target
    
    cd ../net.bar.foo.target.rap
    mvn clean install -Dmaven.repo.local=../../m2
    
    # build features and plugins for rcp, then for rap
    
    cd ../net.bar.foo.releng
    mvn clean install -Dmaven.repo.local=../../m2 -Dtarget.platform=rcp
    mvn clean install -Dmaven.repo.local=../../m2 -Dtarget.platform=rap
    
    # build p2 repository 
    
    cd ../net.bar.foo.updatesite
    mvn clean install -Dmaven.repo.local=../../m2 -Dtarget.platform=rap
    

    Voilà:

    Update site with RCP and RAP flavor of same feature