1

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>
cheppsn
  • 190
  • 13
  • Can you post the contents of the updatesite pom? Keep in mind that the _eclipse-repository_ goal does not take site.xml into account. – tkotisis Dec 14 '17 at 12:33
  • @tkotisis I updated the question accordingly. I'm using the `eclipse-repository` packaging and a `category.xml` – cheppsn Dec 14 '17 at 13:19

1 Answers1

1

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

cheppsn
  • 190
  • 13