blob: 57df8ee9234af84be3bd719d6def599df981484e [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Xtext - Continuous Integration (with Maven)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description"
content="The website of Eclipse Xtext, an open-source framework for development of programming languages and domain-specific languages">
<meta name="author" content="Sven Efftinge">
<meta name="author" content="Miro Spoenemann">
<!-- styles -->
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="/Xtext/images/favicon.png">
<link href="/Xtext/css/bootstrap.css" rel="stylesheet" type='text/css'>
<link href="/Xtext/css/bootstrap-responsive.css" rel="stylesheet" type='text/css'>
<link href="/Xtext/css/shield-responsive.css" rel="stylesheet" type='text/css'>
<link href='/Xtext/css/fonts.css' rel='stylesheet' type='text/css'>
<link href="/Xtext/css/prettyPhoto.css" rel="stylesheet" media="screen" type='text/css'>
<link href="/Xtext/css/prettify.css" type="text/css" rel="stylesheet"/>
<link href="/Xtext/css/style.css" rel="stylesheet" type='text/css'>
<!-- cover flow -->
<link href="/Xtext/css/coverflow.css" rel="stylesheet" type='text/css'>
<!--[if lt IE 9]>
<link href="/css/iebugs.css" rel="stylesheet" type='text/css'>
<![endif]-->
<!-- BEGIN Cookie Consent
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.js"></script>
<script>
window.addEventListener("load", function(){
window.cookieconsent.initialise({
"palette": {
"popup": {
"background": "#000"
},
"button": {
"background": "#f1d600"
}
},
"theme": "edgeless",
"type": "opt-in",
onInitialise: function (status) {
var type = this.options.type;
var didConsent = this.hasConsented();
if (type == 'opt-in' && didConsent) {
// TODO: enable cookies
}
if (type == 'opt-out' && !didConsent) {
// TODO: disable cookies
}
},
onStatusChange: function(status, chosenBefore) {
var type = this.options.type;
var didConsent = this.hasConsented();
if (type == 'opt-in' && didConsent) {
// TODO: enable cookies
}
if (type == 'opt-out' && !didConsent) {
// TODO: disable cookies
}
},
onRevokeChoice: function() {
var type = this.options.type;
if (type == 'opt-in') {
// TODO: disable cookies
}
if (type == 'opt-out') {
// TODO: enable cookies
}
},
"content": {
"href": "http://www.eclipse.org/legal/privacy.php"
}
})});
</script>
END Cookie Consent -->
</head>
<body>
<header class="site-header">
<!-- Navbar -->
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse"
data-target=".nav-collapse"> <span class="icon-bar"></span> <span
class="icon-bar"></span> <span class="icon-bar"></span>
</a> <a class="brand" href="/Xtext/index.html"></a>
<div class="nav-collapse collapse" style="height: 0px;">
<ul class="nav">
<!--li ><a href="/Xtext/news.html">News</a></li-->
<li ><a href="/Xtext/download.html">Download</a></li>
<li ><a href="/Xtext/documentation/index.html">Documentation</a></li>
<li ><a href="/Xtext/community.html">Community</a></li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Support &amp; Trainings<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="https://www.itemis.com/en/xtext/support-and-team/" target="_blank">itemis</a></li>
<li><a href="https://typefox.io/trainings-2" target="_blank">TypeFox</a></li>
</ul>
</li>
<li ><a href="http://xtend-lang.org">Xtend</a></li>
</ul>
<!--div class="nav pull-right">
<li ><a><iframe src="https://ghbtns.com/github-btn.html?user=eclipse&repo=xtext&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px"></iframe></a></li>
</div-->
</div>
<!--/.nav-collapse -->
</div>
</div>
</div>
<!-- Navbar End -->
</header>
<div class="page-content">
<script>
function startSearch(event) {
if (event.keyCode == 13) {
var q = 'site:eclipse.org/Xtext/documentation+' + event.target.value;
window.open('https://www.google.com/search?q=' + q, "_self");
}
}
</script>
<div class="wrapper">
<div id="page">
<div class="inner">
<div id="maincontainer" class="container">
<span class="edit-on-github pull-right">
<a href="https://github.com/eclipse/xtext/edit/website-published/xtext-website/documentation/350_continuous_integration.md">Edit on Github</a>
</span>
<div class="span3" style="margin-left: 0px;">
<div class="search-bar">
<img src="/Xtext/images/search-gray.png"/>
<input type="search" id="google-search" onkeyup="startSearch(event);"/>
</div>
<ul id="nav-outline" style="margin-left: 0px;">
<li class="nav-part">Getting Started</li>
<li><a href="102_domainmodelwalkthrough.html">15 Minutes Tutorial</a></li>
<li><a href="103_domainmodelnextsteps.html">15 Minutes Tutorial - Extended</a></li>
<li><a href="104_jvmdomainmodel.html">Five simple steps to your JVM language</a></li>
<li class="nav-part">Reference Documentation</li>
<li><a href="301_grammarlanguage.html">The Grammar Language</a></li>
<li><a href="302_configuration.html">Configuration</a></li>
<li><a href="303_runtime_concepts.html">Language Implementation</a></li>
<li><a href="305_xbase.html">Integration with Java</a></li>
<li><a href="307_special_languages.html">Typical Language Configurations</a></li>
<li><a href="308_emf_integration.html">Integration with EMF</a></li>
<li><a href="310_eclipse_support.html">Eclipse Support</a></li>
<!--li><a href="320_idea_support.html">IntelliJ IDEA Support</a></li-->
<li><a href="330_web_support.html">Web Editor Support</a></li>
<li><a href="350_continuous_integration.html">Continuous Integration</a></li>
</ul>
</div>
<div class="span8 doc-contents">
<h1 id="continuous-integration">Continuous Integration (with Maven)</h1>
<p>There are two aspects to consider when it comes to continuous integration. Firstly you may want to have a continuous build of your language that runs all tests and creates an Eclipse update site and other needed artifacts, and secondly you may want to have your language and its corresponding code generator integrated in your application builds. We will discuss both cases in this section along with a set of example projects, which you can clone, inspect or download from <a href="https://github.com/xtext/maven-xtext-example">github.com/xtext/maven-xtext-example</a>.</p>
<p>To follow this section you need a basic understanding of how Maven works. Please read a tutorial on Maven if you don’t know anything about it.</p>
<h2 id="an-overview-of-the-example-projects">An overview of the example projects</h2>
<p>If you have a look at the example, you’ll find seven different projects of which six are for the various aspects of the language and its build. First we have the language’s runtime project, UI project and test project. In addition we need a feature project, an update site project and a project where we put the parent pom. The seventh project is called <code>example-project</code> and is really a small application project that uses the built language and triggers the code generator through a dedicated maven plug-in. Let’s first have a look at how to build the language.</p>
<h2 id="tycho-build">Building an Xtext language with Maven and Tycho</h2>
<p>Although the runtime aspects of an Xtext language is not dependent on Eclipse or its OSGi container, an Xtext language is developed in the form of OSGi bundles. For this kind of builds most people rely on <a href="http://eclipse.org/tycho/">Tycho</a>, which is an OSGi/P2 adapter plug-in for Maven builds. Tycho obtains much information from the OSGi bundle’s manifest. Additionally needed information is configured through the pom.xml file which sits at the root of each project.</p>
<h3 id="the-parent-project-mymavenizedherolanguageparent">The parent project (my.mavenized.herolanguage.parent)</h3>
<p>All of the projects are aggregated in a parent pom in the root directory. If you import the projects into eclipse the imported project is called <code>my.mavenized.herolanguage.parent</code>. Information defined in the parent pom is automatically inherited by the aggregated child projects, so you don’t need to reconfigure the same information over and over again. Here we have configured two additional plug-ins:</p>
<ul>
<li>
<p>The Xtend compiler plug-in will generate the Java source code for any Xtend files during the ‘generate-sources’ phase</p>
<pre><code class="language-xml">&lt;pluginManagement&gt;
&lt;plugins&gt;
&lt;!-- xtend-maven-plugin is in pluginManagement instead of in plugins
so that it doesn't run before the exec-maven-plugin's *.mwe2 gen;
this way we can list it after.
--&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.eclipse.xtend&lt;/groupId&gt;
&lt;artifactId&gt;xtend-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;${xtext.version}&lt;/version&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;goals&gt;
&lt;goal&gt;compile&lt;/goal&gt;
&lt;goal&gt;xtend-install-debug-info&lt;/goal&gt;
&lt;goal&gt;testCompile&lt;/goal&gt;
&lt;goal&gt;xtend-test-install-debug-info&lt;/goal&gt;
&lt;/goals&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;configuration&gt;
&lt;outputDirectory&gt;xtend-gen&lt;/outputDirectory&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/pluginManagement&gt;
</code></pre>
</li>
<li>
<p>The Tycho plug-in will pick up and use Eclipse plug-in specific configuration data from the projects in order to build Eclipse conformant OSGi bundles, features and an update site.</p>
<pre><code class="language-xml">&lt;plugins&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.eclipse.tycho&lt;/groupId&gt;
&lt;artifactId&gt;tycho-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;${tycho-version}&lt;/version&gt;
&lt;extensions&gt;true&lt;/extensions&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
</code></pre>
</li>
</ul>
<p>To build the entire project you have to run your maven build with this pom file.</p>
<h3 id="the-update-site-project-mymavenizedherolanguageupdatesite">The update site project (my.mavenized.herolanguage.updatesite)</h3>
<p>The project <code>my.mavenized.herolanguage.updatesite</code> denotes the updatesite project and only contains a pom.xml and a file called category.xml. The latter includes information about which features are contained in the update site. As you can see, the <code>category.xml</code> file points to the single feature, which is defined in the project <code>my.mavenized.herolanguage.sdk</code>.</p>
<h3 id="the-feature-project-mymavenizedherolanguagesdk">The feature project (my.mavenized.herolanguage.sdk)</h3>
<p>This is another project made up on configuration data solely. It contains the <code>feature.xml</code> file which points to the Eclipse plug-ins (bundles) included in this feature.</p>
<h3 id="the-core-language-project-mymavenizedherolanguage">The core language project (my.mavenized.herolanguage)</h3>
<p>The <code>pom.xml</code> for the language project contains information about how Maven should run the Xtext’s code generator. The first plug-in invokes the MWE2 file through a standard Java process:</p>
<pre><code class="language-xml">&lt;plugin&gt;
&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
&lt;artifactId&gt;exec-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;1.4.0&lt;/version&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;id&gt;mwe2Launcher&lt;/id&gt;
&lt;phase&gt;generate-sources&lt;/phase&gt;
&lt;goals&gt;
&lt;goal&gt;java&lt;/goal&gt;
&lt;/goals&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;configuration&gt;
&lt;mainClass&gt;org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher&lt;/mainClass&gt;
&lt;arguments&gt;
&lt;argument&gt;/${project.basedir}/src/my/mavenized/GenerateHeroLanguage.mwe2&lt;/argument&gt;
&lt;argument&gt;-p&lt;/argument&gt;
&lt;argument&gt;rootPath=/${project.basedir}/..&lt;/argument&gt;
&lt;/arguments&gt;
&lt;classpathScope&gt;compile&lt;/classpathScope&gt;
&lt;includePluginDependencies&gt;true&lt;/includePluginDependencies&gt;
&lt;cleanupDaemonThreads&gt;false&lt;/cleanupDaemonThreads&gt;&lt;!-- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=475098#c3 --&gt;
&lt;/configuration&gt;
&lt;dependencies&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.eclipse.emf&lt;/groupId&gt;
&lt;artifactId&gt;org.eclipse.emf.mwe2.launch&lt;/artifactId&gt;
&lt;version&gt;2.9.1.201705291010&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.eclipse.xtext&lt;/groupId&gt;
&lt;artifactId&gt;org.eclipse.xtext.common.types&lt;/artifactId&gt;
&lt;version&gt;${xtext.version}&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.eclipse.xtext&lt;/groupId&gt;
&lt;artifactId&gt;org.eclipse.xtext.xtext.generator&lt;/artifactId&gt;
&lt;version&gt;${xtext.version}&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.eclipse.xtext&lt;/groupId&gt;
&lt;artifactId&gt;org.eclipse.xtext.xbase&lt;/artifactId&gt;
&lt;version&gt;${xtext.version}&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.eclipse.xtext&lt;/groupId&gt;
&lt;artifactId&gt;xtext-antlr-generator&lt;/artifactId&gt;
&lt;version&gt;[2.1.1, 3)&lt;/version&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;/plugin&gt;
</code></pre>
<p>The second used plug-in cleans the directories containing generated resources during the clean phase:</p>
<pre><code class="language-xml">&lt;plugin&gt;
&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
&lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;
&lt;version&gt;2.5&lt;/version&gt;
&lt;configuration&gt;
&lt;filesets&gt;
&lt;fileset&gt;
&lt;directory&gt;${basedir}/../my.mavenized.herolanguage/src-gen/&lt;/directory&gt;
&lt;includes&gt;
&lt;include&gt;**/*&lt;/include&gt;
&lt;/includes&gt;
&lt;/fileset&gt;
&lt;fileset&gt;
&lt;directory&gt;${basedir}/../my.mavenized.herolanguage.tests/src-gen/&lt;/directory&gt;
&lt;includes&gt;
&lt;include&gt;**/*&lt;/include&gt;
&lt;/includes&gt;
&lt;/fileset&gt;
&lt;fileset&gt;
&lt;directory&gt;${basedir}/../my.mavenized.herolanguage.ide/src-gen/&lt;/directory&gt;
&lt;includes&gt;
&lt;include&gt;**/*&lt;/include&gt;
&lt;/includes&gt;
&lt;/fileset&gt;
&lt;fileset&gt;
&lt;directory&gt;${basedir}/../my.mavenized.herolanguage.ui/src-gen/&lt;/directory&gt;
&lt;includes&gt;
&lt;include&gt;**/*&lt;/include&gt;
&lt;/includes&gt;
&lt;/fileset&gt;
&lt;fileset&gt;
&lt;directory&gt;${basedir}/../my.mavenized.herolanguage.ui.tests/src-gen/&lt;/directory&gt;
&lt;includes&gt;
&lt;include&gt;**/*&lt;/include&gt;
&lt;/includes&gt;
&lt;/fileset&gt;
&lt;fileset&gt;
&lt;directory&gt;${basedir}/model/generated/&lt;/directory&gt;
&lt;/fileset&gt;
&lt;/filesets&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
</code></pre>
<h3 id="the-ui-language-project-mymavenizedherolanguageui">The ui language project (my.mavenized.herolanguage.ui)</h3>
<p>Here all code that is specific to eclipse is located. All the additions that you place for the UI of the language, all editors, wizards and preferences, are to be placed inside this project. Regarding the maven build the <code>pom.xml</code> is not very special.</p>
<h3 id="the-tests-language-project-mymavenizedherolanguagetests">The tests language project (my.mavenized.herolanguage.tests)</h3>
<p>To separate the testing code from the application you should place all your unit tests into this project. The <code>pom.xml</code> includes the <code>tycho-surefire-plugin</code> for the testing but nothing special apart.</p>
<h2 id="standalone-build">Integration in Standard Maven Builds</h2>
<p>Now that we can build our language we need to be able to integrate our language compiler in the integration build of application projects. For this purpose a dedicated maven-plugin is available in Maven central. We now refer to the project <code>example-project</code>, which is a standard Java-project that shouldn’t contain any Eclipse plug-in specific information, nor should it be built with Tycho. Let’s have a look at the pom.xml and therein the Xtext plug-in.</p>
<pre><code class="language-xml">&lt;plugin&gt;
&lt;groupId&gt;org.eclipse.xtext&lt;/groupId&gt;
&lt;artifactId&gt;xtext-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;${xtext-version}&lt;/version&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;goals&gt;
&lt;goal&gt;generate&lt;/goal&gt;
&lt;/goals&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;configuration&gt;
&lt;languages&gt;
&lt;language&gt;
&lt;setup&gt;my.mavenized.HeroLanguageStandaloneSetup&lt;/setup&gt;
&lt;outputConfigurations&gt;
&lt;outputConfiguration&gt;
&lt;outputDirectory&gt;src/main/generated-sources/xtend/&lt;/outputDirectory&gt;
&lt;/outputConfiguration&gt;
&lt;/outputConfigurations&gt;
&lt;/language&gt;
&lt;/languages&gt;
&lt;/configuration&gt;
&lt;dependencies&gt;
&lt;dependency&gt;
&lt;groupId&gt;my.mavenized.herolanguage&lt;/groupId&gt;
&lt;artifactId&gt;my.mavenized.herolanguage&lt;/artifactId&gt;
&lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;/plugin&gt;
</code></pre>
<p>You may add multiple languages in the languages section. A language will use the default outputConfiguration, but you can override the different properties just as you can do within Eclipse preferences.</p>
<h2 id="maven-tycho-hints">Maven Tycho Hints</h2>
<p>Tycho allows you to resolve project dependencies against existing p2 repositories. There are two ways to define target p2 repositories in a Tycho build. The first way is to define the repository URLs directly in the <code>pom.xml</code> using maven <code>&lt;repositories&gt;</code> section. The p2 repositories need to be marked with layout=p2.<br />
The second way is to use eclipse <a href="https://wiki.eclipse.org/Tycho/Target_Platform#Target_files">target platform files</a>. This approach is much faster, because the target platform resolution is performed only once, while the repository look-ups have to be done for every module. Using the target platform will drastically reduce the build time, especially in bigger projects with a lot of modules.</p>
<p>To further speed up the p2 dependency resolution step, use the concrete build repository instead of a project’s repository or the huge <a href="http://download.eclipse.org/releases/photon/">eclipse common</a> composite repository. In the table below you can find p2 repository URLs for Xtext releases and their dependencies. Versions in parentheses represent the minimal required versions.</p>
<table>
<thead>
<tr>
<th>Xtext</th>
<th>EMF</th>
<th>MWE2/MWE</th>
<th>Xpand</th>
<th>Eclipse</th>
<th>All included in</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.11.0/">2.11.0</a></td>
<td><a href="http://download.eclipse.org/releases/neon/201606221000">2.12.0</a> (2.12.0)</td>
<td><a href="http://download.eclipse.org/modeling/emft/mwe/updates/releases/2.9.0/">2.9.0</a> (2.7.1)</td>
<td><a href="http://download.eclipse.org/modeling/m2t/xpand/updates/releases/R201605260315">2.2.0</a> (1.4)</td>
<td><a href="http://download.eclipse.org/eclipse/updates/4.6/R-4.6-201606061100">4.6.0</a> (3.6)</td>
<td><a href="http://download.eclipse.org/releases/neon/201606221000">Neon*</a></td>
</tr>
<tr>
<td><a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.10.0/">2.10.0</a></td>
<td><a href="http://download.eclipse.org/releases/neon/201606221000">2.12.0</a> (2.12.0)</td>
<td><a href="http://download.eclipse.org/modeling/emft/mwe/updates/releases/2.9.0/">2.9.0</a> (2.7.1)</td>
<td><a href="http://download.eclipse.org/modeling/m2t/xpand/updates/releases/R201605260315">2.2.0</a> (1.4)</td>
<td><a href="http://download.eclipse.org/eclipse/updates/4.6/R-4.6-201606061100">4.6.0</a> (3.6)</td>
<td><a href="http://download.eclipse.org/releases/neon/201606221000">Neon</a></td>
</tr>
<tr>
<td><a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.9.1/">2.9.1</a></td>
<td><a href="http://download.eclipse.org/modeling/emf/emf/updates/2.11.x/core/">2.11.1</a> (2.10.2)</td>
<td><a href="http://download.eclipse.org/modeling/emft/mwe/updates/releases/2.8.3/">2.8.3</a> (2.7.1)</td>
<td><a href="http://download.eclipse.org/modeling/m2t/xpand/updates/releases/R201505260349">2.1.0</a> (1.4)</td>
<td><a href="http://download.eclipse.org/eclipse/updates/4.5-M-builds/">4.5.2</a> (3.6)</td>
<td><a href="http://download.eclipse.org/releases/mars/">Mars SR2*</a></td>
</tr>
<tr>
<td><a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.8.4/">2.8.4</a></td>
<td><a href="http://download.eclipse.org/modeling/emf/emf/updates/2.11.x/core/">2.11.1</a> (2.10.2)</td>
<td><a href="http://download.eclipse.org/modeling/emft/mwe/updates/releases/2.8.1/">2.8.1</a> (2.7.1)</td>
<td><a href="http://download.eclipse.org/modeling/m2t/xpand/updates/releases/R201505260349">2.1.0</a> (1.4)</td>
<td><a href="http://download.eclipse.org/eclipse/updates/4.5/R-4.5-201506032000/">4.5.1</a> (3.6)</td>
<td><a href="http://download.eclipse.org/releases/mars/">Mars SR1</a></td>
</tr>
<tr>
<td><a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.8.3/">2.8.3</a>, <a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.8.2/">2.8.2</a>, <a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.8.1/">2.8.1</a></td>
<td><a href="http://download.eclipse.org/modeling/emf/emf/updates/2.11/core/R201506010402/">2.11.0</a> (2.10.2)</td>
<td><a href="http://download.eclipse.org/modeling/emft/mwe/updates/releases/2.8.0/">2.8.0</a> (2.7.1)</td>
<td><a href="http://download.eclipse.org/modeling/m2t/xpand/updates/releases/R201505260349">2.1.0</a> (1.4)</td>
<td><a href="http://download.eclipse.org/eclipse/updates/4.5/R-4.5-201506032000/">4.5.0</a> (3.6)</td>
<td><a href="http://download.eclipse.org/releases/mars/201506241002/">Mars R</a></td>
</tr>
<tr>
<td><a href="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/maintenance/R201411190455/">2.7.3</a></td>
<td><a href="http://download.eclipse.org/modeling/emf/emf/updates/2.10.x/core/S201501230452/">2.10.2</a> (2.10)</td>
<td><a href="http://download.eclipse.org/modeling/emft/mwe/updates/releases/R201409021051/mwe2lang/">2.7.0</a> <a href="http://download.eclipse.org/modeling/emft/mwe/updates/releases/R201409021027/mwe">1.3.4</a> (2.7.0/1.2)</td>
<td><a href="http://download.eclipse.org/modeling/m2t/xpand/updates/releases/R201406030414">2.0.0</a> (1.4)</td>
<td><a href="http://download.eclipse.org/eclipse/updates/4.4/R-4.4.2-201502041700">4.4.2</a> (3.6)</td>
<td><a href="http://download.eclipse.org/releases/luna/201502271000/">Luna SR2</a></td>
</tr>
</tbody>
</table>
<p>The following is an example target platform definition for Xtext 2.8.4 and eclipse 4.5 alias Mars R.</p>
<pre><code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;?pde version="3.8"?&gt;
&lt;target name="org.xtext.myxtextlanguage.target" sequenceNumber="1"&gt;
&lt;locations&gt;
&lt;location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="false" type="InstallableUnit"&gt;
&lt;unit id="org.eclipse.jdt.feature.group" version="0.0.0"/&gt;
&lt;unit id="org.eclipse.platform.feature.group" version="0.0.0"/&gt;
&lt;unit id="org.eclipse.pde.feature.group" version="0.0.0"/&gt;
&lt;unit id="org.eclipse.draw2d.feature.group" version="0.0.0"/&gt;
&lt;unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/&gt;
&lt;unit id="org.eclipse.xpand" version="0.0.0"/&gt;
&lt;unit id="org.eclipse.xtend" version="0.0.0"/&gt;
&lt;unit id="org.eclipse.xtend.typesystem.emf" version="0.0.0"/&gt;
&lt;repository location="http://download.eclipse.org/releases/mars/201506241002/"/&gt;
&lt;/location&gt;
&lt;location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="false" type="InstallableUnit"&gt;
&lt;unit id="org.eclipse.emf.mwe2.launcher.feature.group" version="0.0.0"/&gt;
&lt;repository location="http://download.eclipse.org/modeling/emft/mwe/updates/releases/2.8.1/"/&gt;
&lt;/location&gt;
&lt;location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="false" type="InstallableUnit"&gt;
&lt;unit id="org.eclipse.xtext.sdk.feature.group" version="0.0.0"/&gt;
&lt;repository location="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.8.4/"/&gt;
&lt;/location&gt;
&lt;/locations&gt;
&lt;/target&gt;
</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="site-footer">
<div id="extra">
<div class="inner">
<div class="container">
<div class="row">
<div class="span6">
<h3 class="footer-links-header">Quick Links</h3>
<ul class="footer-links clearfix">
<li><a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
<li><a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
<li><a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
<li><a href="http://www.eclipse.org/legal/">Legal</a></li>
</ul>
<ul class="footer-links clearfix">
<li><a href="http://www.eclipse.org">Eclipse Home</a></li>
<li><a href="http://marketplace.eclipse.org/">Market Place</a></li>
<li><a href="http://live.eclipse.org/">Eclipse Live</a></li>
<li><a href="http://www.planeteclipse.org/">Eclipse Planet</a></li>
</ul>
</div>
<div class="span6">
<!-- Social Media Links -->
<h3 class="footer-links-header"">Social Media</h3>
<ul class="footer-links clearfix">
<li>
<a href="https://twitter.com/xtext"><img src="/Xtext/images/Twitter-bird-darkgray.png" class="img-responsive" style="margin-right: 5px;height: 1em;" alt="Twitter icon">@xtext on Twitter</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<a href="#" class="scrollup fadeOutRight animated" style="display: none;">ScrollUp</a>
<!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="/Xtext/js/jquery-1.11.3.min.js"></script>
<script src="/Xtext/js/bootstrap.min.js"></script>
<script src="/Xtext/js/jquery.easing.1.3.js" type="text/javascript"></script>
<script src="/Xtext/js/jquery.prettyPhoto.js" type="text/javascript"></script>
<script src="/Xtext/js/prettify.js" type="text/javascript"></script>
<script src="/Xtext/js/lang-xtend.js" type="text/javascript"></script>
<script src="/Xtext/js/lang-common.js" type="text/javascript"></script>
<script src="/Xtext/js/custom.js" type="text/javascript"></script>
<!--script src="https://apis.google.com/js/platform.js" async defer></script-->
<!--script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push([ '_setAccount', 'UA-2429174-3' ]);
_gaq.push([ '_trackPageview' ]);
(function() {
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl'
: 'http://www')
+ '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
</script-->
<script src="/Xtext/js/coverflow.min.js" type="text/javascript"></script>
<script>
$(function() {
$('#coverflow').coverflow({
active : 1,
visibleAside: 2,
overlap : 0.5,
scale : 0.9,
angle : 20,
trigger : {
"itemfocus" : true,
"swipe" : true,
"mousewheel" : false
}
});
$('#coverflow :hidden').toggle();
$(window).resize(function() {
$('#coverflow').coverflow();
});
});
</script>
</footer>
</body>
</html>