Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [tycho-user] Tycho and single source RCP/RAP

Hello Jay,

as the application I am working at is a commercial one, I cannot just
publish my whole POMs on this mailing list. But at least, I can
provide you with some details and the major sections in my POM files
that do the trick...

First of all, I have a hierarchy of three parent POM files, each in
individual projects which build as individual artifacts as well:

1) There is a master parent in which I just activate Tycho:

<properties>
  <tycho-version>0.14.1</tycho-version>
</properties>

<build>
  <plugins>
    <plugin>
      <groupId>org.eclipse.tycho</groupId>
      <artifactId>tycho-maven-plugin</artifactId>
      <version>${tycho-version}</version>
      <extensions>true</extensions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.3.1</version>
      <configuration>
        <source>1.6</source>
        <target>1.6</target>
      </configuration>
    </plugin>
  </plugins>
</build>

2) A second-level parent, in which I configure the P2 repositories to
use for resolving (internal and external) dependencies. This parent is
used by the three "compatibility" plugins and fragments respectively
(see below for further details). Here, the "extra requirements" are
also configured as described in my initial response to this posting.

<repositories>
  <repository>
    <id>common</id>
    <layout>p2</layout>
    <url>${common-site}</url>
  </repository>
</repositories>

<build>
  <plugins>
    <plugin>
      <groupId>org.eclipse.tycho</groupId>
      <artifactId>tycho-source-plugin</artifactId>
      <version>${tycho-version}</version>
      <executions>
        <execution>
          <id>plugin-source</id>
          <goals>
            <goal>plugin-source</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.eclipse.tycho</groupId>
      <artifactId>target-platform-configuration</artifactId>
      <version>${tycho-version}</version>
      <configuration>
        <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>client-rcp</id>
    <activation>
      <activeByDefault>false</activeByDefault>
      <property>
        <name>maven.profile</name>
        <value>client-rcp</value>
      </property>
    </activation>
    <repositories>
      <repository>
        <id>rcp</id>
        <layout>p2</layout>
        <url>${rcp-site}</url>
      </repository>
    </repositories>
    <build>
      <plugins>
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>target-platform-configuration</artifactId>
          <version>${tycho-version}</version>
          <configuration>
            <dependency-resolution>
              <optionalDependencies>ignore</optionalDependencies>
              <extraRequirements>
                <requirement>
                  <type>eclipse-plugin</type>
                  <id>org.eclipse.ui</id>
                  <versionRange>0.0.0</versionRange>
                </requirement>
                <requirement>
                  <type>eclipse-plugin</type>
                  <id>org.eclipse.ui.views</id>
                  <versionRange>0.0.0</versionRange>
                </requirement>
              </extraRequirements>
            </dependency-resolution>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>client-rap</id>
    <activation>
      <activeByDefault>false</activeByDefault>
      <property>
        <name>maven.profile</name>
        <value>client-rap</value>
      </property>
    </activation>
    <repositories>
      <repository>
        <id>rap</id>
        <layout>p2</layout>
        <url>${rap-site}</url>
      </repository>
    </repositories>
    <build>
      <plugins>
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>target-platform-configuration</artifactId>
          <version>${tycho-version}</version>
          <configuration>
            <dependency-resolution>
              <optionalDependencies>ignore</optionalDependencies>
              <extraRequirements>
                <requirement>
                  <type>eclipse-plugin</type>
                  <id>org.eclipse.rap.ui</id>
                  <versionRange>0.0.0</versionRange>
                </requirement>
                <requirement>
                  <type>eclipse-plugin</type>
                  <id>org.eclipse.rap.ui.views</id>
                  <versionRange>0.0.0</versionRange>
                </requirement>
              </extraRequirements>
            </dependency-resolution>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>server</id>
    <activation>
      <activeByDefault>false</activeByDefault>
      <property>
        <name>maven.profile</name>
        <value>server</value>
      </property>
    </activation>
    <repositories>
      <repository>
        <id>equinox</id>
        <layout>p2</layout>
        <url>${equinox-site}</url>
      </repository>
    </repositories>
  </profile>
</profiles>

3) A third-level parent, which is used by all of my client projects
that itself depend on the "compatibility" plugins and fragments (see
below for further details). Here, the same trick with "extra
dependencies" is applied to add the corresponding RCP- or RAP-fragment
of the "compatibility" plugin depending on the active Maven profile.
Note the combine.children="append" attribute which makes Tycho to
append the extra requirements to the ones already defined in the
second-level parent ;-).

<profiles>
  <profile>
    <id>client-rcp</id>
    <activation>
      <activeByDefault>false</activeByDefault>
      <property>
        <name>maven.profile</name>
        <value>client-rcp</value>
      </property>
    </activation>
    <build>
      <plugins>
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>target-platform-configuration</artifactId>
          <version>${tycho-version}</version>
          <configuration>
            <dependency-resolution>
              <optionalDependencies>ignore</optionalDependencies>
              <extraRequirements combine.children="append">
                <requirement>
                  <type>eclipse-plugin</type>
                  <id>com.initplan.mplan.client.compatibility.rcp</id>
                  <versionRange>0.0.0</versionRange>
                </requirement>
              </extraRequirements>
            </dependency-resolution>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>client-rap</id>
    <activation>
      <activeByDefault>false</activeByDefault>
      <property>
        <name>maven.profile</name>
        <value>client-rap</value>
      </property>
    </activation>
    <build>
      <plugins>
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>target-platform-configuration</artifactId>
          <version>${tycho-version}</version>
          <configuration>
            <dependency-resolution>
              <optionalDependencies>ignore</optionalDependencies>
              <extraRequirements combine.children="append">
                <requirement>
                  <type>eclipse-plugin</type>
                  <id>com.initplan.mplan.client.compatibility.rap</id>
                  <versionRange>0.0.0</versionRange>
                </requirement>
              </extraRequirements>
            </dependency-resolution>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

Now the trick for defining dependencies to platform-specific plugins
(such as org.eclipse.ui, and org.eclipse.rap.ui respectively) is to
create a "compatibilty" plugin which optionally depends on those
plugins and re-exports its dependencies. All other client plugins only
depend then on the "compatibility" plugin. Additionally, there are two
fragments (one for RCP, one for RAP) to this "compatibility" plugin in
which I placed some helper code (e.g. a SingletonProvider
implementation) that requires different implementation for RCP and RAP
respectively. This approach is also described in the RAP
Single-Sourcing Guide provided by EclipseSource here:
http://eclipsesource.com/en/info/rcp-rap-single-sourcing-guideline/

For selecting the proper Maven profile at build time, I just specify
the "-P <profile>" option in my build scripts and the Jenkins
configuration ("Goals" field) respectively. Alternatively, you can
also activate a profile by configuring a particular system property
(in my case "maven.profile") in your POMs and add the
"-Dmaven.profile=<profile>" option to your JVM running the Maven/Tycho
build.

Hope this descriptions helps. If you have further questions, feel free to ask.

Regards
Timo



2012/10/18 Jay Jay Billings <jayjaybillings@xxxxxxxxx>:
> Timo,
>
> I am working on a single source application too. Could you share your whole
> POM or at least the part that shows the profiles? Also, how do you select a
> profile at build time?
>
> Jay
>
> On Oct 18, 2012 4:22 AM, "Timo Rohrberg" <rti.init@xxxxxxxxxxxxxx> wrote:
>>
>> Hello Thorsten,
>>
>> I guess, I had exactly the same problem in our single-sourcing RCP/RAP
>> application. I solved it by adding so-called "extra requirements"
>> definitions into my pom.xml configuration files to explicitely require
>> the corresponding semi-optional dependencies (in my case
>> org.eclipse.ui and org.eclipse.ui.views and the corresponding RAP
>> replacements). I placed that "extra requirements" definitions into
>> Maven profiles sections and select the appropriate profile for
>> building my application in "RCP-" and "RAP-"mode respectively.
>>
>> The configuration of "extra dependencies" looks like this:
>>
>> <plugin>
>>   <groupId>org.eclipse.tycho</groupId>
>>   <artifactId>target-platform-configuration</artifactId>
>>   <version>${tycho-version}</version>
>>   <configuration>
>>     <dependency-resolution>
>>       <optionalDependencies>ignore</optionalDependencies>
>>       <extraRequirements>
>>         <requirement>
>>           <type>eclipse-plugin</type>
>>           <id>org.eclipse.rap.ui</id>
>>           <versionRange>0.0.0</versionRange>
>>         </requirement>
>>         <requirement>
>>           <type>eclipse-plugin</type>
>>           <id>org.eclipse.rap.ui.views</id>
>>           <versionRange>0.0.0</versionRange>
>>         </requirement>
>>       </extraRequirements>
>>     </dependency-resolution>
>>   </configuration>
>> </plugin>
>>
>> If you are interested in more details about my setup which - after
>> days of work and investigation - finally works quite smoothly, feel
>> free to ask.
>>
>> Hope that helps.
>>
>> Regards
>> Timo
>>
>>
>> 2012/10/18 Thorsten Schlathoelter <tschlat@xxxxxx>:
>> > Hi,
>> > we have a single source RCP/RAP application that I am trying to build
>> > with tycho. The problem is that we need to mark specific ui bundles as
>> > optional because they are only present in either RAP or RCP target platform.
>> > E.g. org.eclipse.ui or org.eclipse.rap.ui. Actually these dependencies are
>> > semi optional. Depending on the platform to be build one representation has
>> > to be present.
>> >
>> > We need to configure tycho with
>> >
>> > <dependency-resolution>
>> >    <optionalDependencies>ignore</optionalDependencies>
>> > </dependency-resolution>
>> >
>> > in order to get the bundles resolved. But then when we try to compile,
>> > the respective optional platform bundles are not pulled from p2 into the
>> > maven repository. In the course this results in compile errors. The next
>> > problem is that the respective platform specific fragments do not compile
>> > because they depend on optional required bundles of their host plugin.
>> > Solving the fragment issue by adding the optional required bundles from the
>> > host to the fragment itself makes this post somewhat for the records.
>> > Because the fragment required bundle can be made non optional thus the
>> > dependencies are pulled from p2 and are available at compile time also for
>> > the host. Nevertheless if no such fragment exists which pulls the
>> > dependencies building single source RCP/RAP with tycho seems to be
>> > problematic.
>> >
>> > Any thoughts/hints on this?
>> >
>> > Regards,
>> > Thorsten
>> >
>> > _______________________________________________
>> > tycho-user mailing list
>> > tycho-user@xxxxxxxxxxx
>> > https://dev.eclipse.org/mailman/listinfo/tycho-user
>> _______________________________________________
>> tycho-user mailing list
>> tycho-user@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/tycho-user
>
>
> _______________________________________________
> tycho-user mailing list
> tycho-user@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/tycho-user
>


Back to the top