Difference between revisions of "Scout/Tutorial/3.9/Maven Tycho Build"
Line 1: | Line 1: | ||
== Introduction == | == Introduction == | ||
− | This tutorial shows how to build an existing Scout application using [http://www.eclipse.org/tycho/ Maven Tycho]. Therefore we use the | + | This tutorial shows how to build an existing Scout application using [http://www.eclipse.org/tycho/ Maven Tycho]. Therefore we use the [[{{BASEPAGENAME}}/Minicrm Step-by-Step|name=Minicrm application]] as base Scout application to integrate it into the Maven Tycho world. |
== Installation / Prerequisites == | == Installation / Prerequisites == |
Revision as of 03:22, 2 April 2013
Contents
- 1 Introduction
- 2 Installation / Prerequisites
- 3 Maven Tycho Integration of existing Plugins
- 4 Build Eclipse Scout Swing client application (building an Eclipse Product)
- 5 Build Eclipse Scout Server WAR (building an Eclipse Product)
- 6 Testing an Eclipse Scout Client/Server Application (using JUnit/Maven Tycho Surefire)
- 7 Advanced Topics
Introduction
This tutorial shows how to build an existing Scout application using Maven Tycho. Therefore we use the name=Minicrm application as base Scout application to integrate it into the Maven Tycho world.
Installation / Prerequisites
This tutorial assumes that your environment fulfills the following requirements.
Eclipse
Eclipse for Scout Developers Juno
Download-URL: http://www.eclipse.org/downloads/packages/eclipse-scout-developers/junor
m2eclipse
Updatesite-URL: http://download.eclipse.org/releases/juno (or http://download.eclipse.org/technology/m2e/releases)
choose: m2e - Maven Integration for Eclipse (1.1.0.20120530-0009)
Install m2e connectors: Window > Preferences > Maven > Discovery > Open Catalog
choose: Tycho Configurator
Optional: EGit
Updatesite-URL: http://download.eclipse.org/releases/juno (or http://download.eclipse.org/egit/updates)
choose: Eclipse EGit (2.0.0.201206130900-r) Eclipse JGit (2.0.0.201206130900-r)
Maven
Installation guide: http://maven.apache.org/download.html#Installation
Maven Tycho Integration of existing Plugins
- 1. Create new Eclipse Project (used as parent POM)
- 2. Generate POMs for existing projects / plug-ins
mvn org.eclipse.tycho:tycho-pomgenerator-plugin:generate-poms -DgroupId=org.eclipse.minicrm -Dversion=1.0.0-SNAPSHOT -DextraDirs=../org.eclipse.minicrm.client,../org.eclipse.minicrm.server,../org.eclipse.minicrm.shared,../org.eclipse.minicrm.ui.rap,../org.eclipse.minicrm.ui.swing,../org.eclipse.minicrm.ui.swt
Sample 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> <groupId>org.eclipse.scout.autotest</groupId> <artifactId>org.eclipse.scout.autotest</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../org.eclipse.scout.autotest.parent/</relativePath> </parent> <artifactId>org.eclipse.scout.autotest.client</artifactId> <packaging>eclipse-plugin</packaging> </project>
- 3. Convert every project into a Maven Project: Configure > Convert to Maven Project...
- 4. [Optional] Resolve Warnings caused by the previous steps (see Problems-View)
- Delete every bin directory and fix build.properties files (Cause: The project's output folder was changed from /bin to /target/classes)
- Delete duplicate Maven Coordinates (groupId and version)
- 5. Extend parent POM configuration
- Add Eclipse and RAP platform Repositories (using Maven Profiles)
<profiles> <profile> <id>platform-juno</id> <activation> <activeByDefault>true</activeByDefault> <property> <name>platform-version-name</name> <value>juno</value> </property> </activation> <properties> <eclipse.repo.url>http://download.eclipse.org/releases/juno</eclipse.repo.url> <rap.repo.url>http://download.eclipse.org/rt/rap/1.5/runtime</rap.repo.url> <platform.version>[3.8,3.9)</platform.version> <tycho.version>0.15.0</tycho.version> </properties> </profile> </profiles> <repositories> <repository> <id>eclipse platform</id> <url>${eclipse.repo.url}</url> <layout>p2</layout> </repository> <repository> <id>rap platform</id> <url>${rap.repo.url}</url> <layout>p2</layout> </repository> </repositories>
- Replace existing Build settings
<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> <configuration> <environments> <environment> <os>win32</os> <ws>win32</ws> <arch>x86</arch> </environment> </environments> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>target-platform-configuration</artifactId> <version>${tycho.version}</version> <configuration> <filters> <!-- work around Equinox bug 348045 --> <filter> <type>p2-installable-unit</type> <id>org.eclipse.equinox.servletbridge.extensionbundle</id> <removeAll /> </filter> </filters> </configuration> </plugin> </plugins> </pluginManagement> </build>
- 6. Build parent POM
mvn clean package
Build Eclipse Scout Swing client application (building an Eclipse Product)
- 1. Create new Eclipse Project (holding the client Product)
- 2. Add / Create Swing client Product
- Important: Tycho only supports *.product file in the project root
- Important: The *.product file has to contain the attribute 'uid' (correspond to the ID field in the Product Configurator view)
- 3. Create POM configuration
- pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.eclipse.minicrm</groupId> <artifactId>org.eclipse.minicrm</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../org.eclipse.minicrm/</relativePath> </parent> <artifactId>org.eclipse.minicrm.swing.product</artifactId> <packaging>eclipse-repository</packaging> <properties> <product.id>org.eclipse.minicrm.swing</product.id> <product.outputDirectory>${project.build.directory}/products/${product.id}/win32/win32/x86</product.outputDirectory> <product.finalName>minicrm</product.finalName> </properties> <build> <plugins> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-p2-director-plugin</artifactId> <executions> <execution> <id>materialize-products</id> <phase>package</phase> <goals> <goal>materialize-products</goal> </goals> </execution> </executions> <configuration> <products> <product> <id>${product.id}</id> </product> </products> </configuration> </plugin> <!-- Workaround: Use an existing config.ini file (caused by the problem that tycho will always generate a default one) --> <plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <resources> <resource> <directory>${project.build.directory}/../</directory> <filtering>false</filtering> <includes> <include>config.ini</include> </includes> </resource> </resources> <outputDirectory>${product.outputDirectory}/configuration</outputDirectory> <overwrite>true</overwrite> </configuration> </execution> </executions> </plugin> <!-- Configure the assembly plugin to build the final client zip file --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> <finalName>${product.finalName}</finalName> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
- assembly.xml
<assembly> <id>org.eclipse.minicrm.client.zip</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <!-- exported product files --> <fileSet> <directory>${product.outputDirectory}</directory> <outputDirectory>/${product.finalName}</outputDirectory> <excludes> <exclude>p2/**</exclude> <exclude>eclipsec.exe</exclude> <exclude>artifacts.xml</exclude> </excludes> </fileSet> </fileSets> </assembly>
- 4. Convert to a Maven Project: Configure > Convert to Maven Project...
- 5. Update the parent POM
- Extend the modules by the new Maven Module
- Define the newly used Maven Plugins in pluginManagement
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.5</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-p2-director-plugin</artifactId> <version>${tycho.version}</version> </plugin>
- 6. Build parent POM
Build Eclipse Scout Server WAR (building an Eclipse Product)
- 1. Create new Eclipse Project (holding the server Product)
- 2. Add / Create server Product
- 3. Create POM configuration
- pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.eclipse.minicrm</groupId> <artifactId>org.eclipse.minicrm</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../org.eclipse.minicrm/</relativePath> </parent> <artifactId>org.eclipse.minicrm.server.product</artifactId> <packaging>eclipse-repository</packaging> <properties> <product.id>org.eclipse.minicrm.server.product</product.id> <product.outputDirectory>${project.build.directory}/products/${product.id}/win32/win32/x86</product.outputDirectory> <product.finalName>minicrm</product.finalName> </properties> <build> <plugins> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-p2-director-plugin</artifactId> <executions> <execution> <id>materialize-products</id> <phase>package</phase> <goals> <goal>materialize-products</goal> </goals> </execution> </executions> <configuration> <products> <product> <id>${product.id}</id> </product> </products> </configuration> </plugin> <!-- Workaround: Use an existing config.ini file (caused by the problem that tycho will always generate a default one) --> <plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <resources> <resource> <directory>${project.build.directory}/../</directory> <filtering>false</filtering> <includes> <include>config.ini</include> </includes> </resource> </resources> <outputDirectory>${product.outputDirectory}/configuration</outputDirectory> <overwrite>true</overwrite> </configuration> </execution> </executions> </plugin> <!-- Configure the assembly plugin to build the final server war file --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> <finalName>${product.finalName}</finalName> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
- assembly.xml
<assembly> <id>org.eclipse.minicrm.server.war</id> <formats> <format>war</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <!-- web-inf template --> <fileSet> <directory>${basedir}/templates/WEB-INF</directory> <outputDirectory>/WEB-INF</outputDirectory> <includes> <include>**</include> </includes> </fileSet> <!-- exported product files --> <fileSet> <directory>${product.outputDirectory}</directory> <outputDirectory>/WEB-INF/eclipse</outputDirectory> <includes> <include>configuration/**</include> <include>plugins/**</include> </includes> </fileSet> </fileSets> </assembly>
- 4. Convert to a Maven Project: Configure > Convert to Maven Project...
- 5. Update the parent POM
- Extend the modules by the new Maven Module
- 6. Add WEB-INF template to match Equinox in a Servlet Container requirements (directory location has to match the referred fileSet in assembly.xml)
- A running WEB-INF template can be extracted from a Scout SDK exported war file. Details can be found here.
- 7. Build parent POM
Testing an Eclipse Scout Client/Server Application (using JUnit/Maven Tycho Surefire)
Using Maven Tycho Surefire you can test your Eclipse Scout Application automatically. A sample application is on https://github.com/innovad/scout.autotest.demo. More details tbd.
Plugin/Fragment/Feature Setup
Create the required testing plugins and fragments for your Scout application. You will have to create a plugin and a fragment for each module (client, server, shared) to be tested. We recommend to use the following naming conventions:
- org.yourapp.client
- org.yourapp.client.test
- A plugin holding some support classes (no JUnit tests here)
- org.yourapp.client.test.fragment
- A fragment with host org.yourapp.client containing the JUnit tests. The tests will be loaded with the plugin to be tested by the OSGi framework.
- org.yourapp.server
- org.yourapp.server.test
- similar as above
- org.yourapp.server.test.fragment
- similar as above
- org.yourapp.shared
- org.yourapp.shared.test
- similar as above
- org.yourapp.shared.test.fragment
- similar as above
- org.yourapp.client.feature
- org.yourapp.server.feature
- org.yourapp.server.product
- org.yourapp.ui.swing.product
- org.yourapp.ui.swing
- org.yourapp.parent
- org.yourapp.target
Testing Server
Testing Client
Debugging a Test
- Add the "debugPort" to your pom.xml
<plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-surefire-plugin</artifactId> <version>${tycho.version}</version> <configuration> <debugPort>18081</debugPort> </configuration> </plugin>
- Create a new Debug Configuration in Eclipse of type "Remote Java Application" (localhost:18081)
- Tycho stops with "Listening for transport dt_socket at address: 18081"
- At this point, Run your Debug Configuration
Advanced Topics
Support Rayo Look and Feel for Eclipse Scout
Add new P2-Repository with the corresponding Update Site URL
Support JDBC Drivers for Eclipse Scout
Add new P2-Repository with the corresponding Update Site URL
Integrate the JRE into the client zip
Extend the assembly.xml's fileSets definition:
<!-- integrate the JRE into the client zip --> <fileSet> <directory>/path/to/jre</directory> <outputDirectory>/${product.finalName}/jre</outputDirectory> </fileSet>