blob: 86534ee5967c146ce664222e8b1371b603727499 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]> <html lang="en" class="ie8"> <![endif]-->
<!--[if IE 9]> <html lang="en" class="ie9"> <![endif]-->
<!--[if !IE]><!-->
<html lang="en"> <!--<![endif]-->
<head>
<title>M2Eclipse | Extension Development</title>
<!-- Meta -->
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="M2Eclipse provides tight integration for Apache Maven into the Eclipse IDE." />
<meta name="author" content="eclipse.org" />
<meta property="twitter:account_id" content="15710507" />
<!-- CSS Global Compulsory-->
<link rel="stylesheet" href="/m2e/assets/plugins/bootstrap/css/bootstrap.css" />
<link rel="stylesheet" href="/m2e/assets/css/style.css" />
<link rel="stylesheet" href="/m2e/assets/css/m2eclipse.css" />
<link rel="shortcut icon" href="/m2e/assets/img/favicon.ico" />
<!-- CSS Implementing Plugins -->
<link rel="stylesheet" href="/m2e/assets/plugins/font-awesome/css/font-awesome.css" />
<!-- GA -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-56202333-1', 'eclipse.org');
ga('send', 'pageview');
</script>
</head>
<body>
<div class="wrap">
<div class="header">
<div class="navbar navbar-default" role="navigation">
<div class="container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/m2e/index.html">
<img id="logo-header" src="/m2e/assets/img/m2e_logo@2x.svg" alt="M2Eclipse" width="150" height="61" style="margin:20px 0px 10px;"/>
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-responsive-collapse">
<ul class="nav navbar-nav navbar-left">
<li class="">
<a href="/m2e/m2e-news.html">News</a>
</li>
<li class="">
<a href="/m2e/m2e-downloads.html">Download</a>
</li>
<li class="">
<a href="/m2e/documentation/m2e-documentation.html">Documentation</a>
</li>
<li class="">
<a href="/m2e/m2e-community.html">Community</a>
</li>
</ul>
</div>
</div>
</div>
</div><!-- END header -->
<div class="margin-bottom-20"></div>
<div class="container">
<div class="row">
<div class="col-md-3">
<div class="margin-bottom-30"></div>
<h4 class="headline">Users</h2>
<ul class="unstyled">
<li><a href="/m2e/documentation/m2e-faq.html">FAQ</a></li>
<li><a href="/m2e/documentation/m2e-execution-not-covered.html">Execution Not Covered</a></li>
</ul>
<h4 class="headline">Developers</h2>
<ul class="unstyled">
<li><a href="/m2e/documentation/m2e-development-environment.html">Developement Environment Setup</a></li>
</ul>
<h4 class="headline">Extension Developers</h2>
<ul class="unstyled">
<li><a href="/m2e/documentation/m2e-extension-development.html">Getting Started</a></li>
</ul>
<h4 class="headline">Release Notes</h2>
<ul class="unstyled">
<li><a href="/m2e/documentation/release-notes-15.html">M2Eclipse 1.5</a></li>
</ul>
</div>
<div class="col-md-9 docs">
<h1><a href="#setting-up-eclipse-ide" name="setting-up-eclipse-ide">Setting up Eclipse IDE</a></h1>
<ul>
<li>&ldquo;Standard&rdquo; Eclipse distribution 4.3 or newer from <a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a></li>
<li>m2e 1.4 or newer from <a href="http://download.eclipse.org/technology/m2e/releases/">http://download.eclipse.org/technology/m2e/releases/</a>, including semi-hidden m2e SDK feature (uncheck &ldquo;Group items by category&rdquo; to see it)</li>
</ul><p><img src="/m2e/assets/img/m2e-sdk-install.png" alt="SDK""/></p><h2><a href="#command-line-build" name="command-line-build">Command line build</a></h2><p>Download and unpack to a local folder Maven 3.0.3 or better available from <a href="http://maven.apache.org/download.html">http://maven.apache.org/download.html</a></p><h1><a href="#prerequisites" name="prerequisites">Prerequisites</a></h1><p>Some OSGi bundle development and PDE knowledge is assumed.</p>
<ul>
<li>Doc: <a href="http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.pde.doc.user/guide/intro/pde_overview.htm">http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.pde.doc.user/guide/intro/pde_overview.htm</a></li>
<li>Getting Started: <a href="http://www.eclipse.org/articles/Article-PDE-does-plugins/PDE-intro.html">http://www.eclipse.org/articles/Article-PDE-does-plugins/PDE-intro.html</a></li>
<li>Lars Vogel Tutorial:<a href="http://www.vogella.de/articles/EclipsePlugIn/article.html">http://www.vogella.de/articles/EclipsePlugIn/article.html</a></li>
</ul><h2><a href="#java-code-generation-overview" name="java-code-generation-overview">Java code generation overview</a></h2><p>Although there are no strict rules, usually maven java code generation plugins like antlr3-maven-plugin or maven-jaxb-plugin take one or more input files from project source tree and generate a number java source files in a subdirectory of target/generated-sources/ directory. These generated sources are usually required to compile and/or run project tests.</p><p>To properly support code generation inside Eclipse IDE workspace, the IDE generally needs to perform some configuration (semi) statically during project import and then do actually code generation either on request or automatically as part of workspace build.</p><p>m2e extension that provides support for generation will typically need to:</p>
<ul>
<li>implement a subclass of org.eclipse.m2e.jdt.AbstractJavaProjectConfigurator to perform necessary project configuration</li>
<li>implement subclass of MojoExecutionBuildParticipant to delegate actual code generation to underlying maven plugin goal</li>
<li>provide metadata to register the project configurator with m2e and to map maven plugin execution to the project configurator</li>
</ul><h2><a href="#m2e-antlr3-code-generation-support-explained" name="m2e-antlr3-code-generation-support-explained">m2e/antlr3 code generation support explained</a></h2><p>As an example, here is explanation of how different parts of <a href="https://github.com/sonatype/m2eclipse-extras/tree/0.13.0.20110622-1538/org.sonatype.m2e.antlr">m2e/antlr</a> fit together.</p><p>On command line, <a href="http://www.antlr.org/antlr3-maven-plugin/usage.html">antlr3-maven-plugin</a>, reads ANTLR grammar files from directory specified by ${sourceDirectory} plugin configuration parameter (defaults to src/main/antlr3) and generates output files in directory specified by ${outputDirectory} plugin configuration parameter (defaults to target/generated-sources/antlr3).</p><h2><a href="https://github.com/sonatype/m2eclipse-extras/blob/0.13.0.20110622-1538/org.sonatype.m2e.antlr/src/org/sonatype/m2e/antlr/internal/AntlrProjectConfigurator.java">AntlrProjectConfigurator</a> and corresponding metadata</h2><p><a href="http://git.eclipse.org/c/m2e/m2e-core.git/tree/org.eclipse.m2e.jdt/src/org/eclipse/m2e/jdt/AbstractJavaProjectConfigurator.java?id=releases/1.0/1.0.0.20110607-2117">AbstractJavaProjectConfigurator</a> is a convenience abstract implementation of AbstractProjectConfigurator that provides default behaviour common to many java code generation m2e extensions. AbstractJavaProjectConfigurator assumes single additional java source folder needs to be configured for the project and the source folder location is defined by ${outputDirectory} maven plugin configuration parameter. This allows very simple ANTLR project configurator implementation (is explained below)</p>
<pre class="prettyprint linenums">
public class AntlrProjectConfigurator extends AbstractJavaProjectConfigurator {
@Override
public AbstractBuildParticipant getBuildParticipant(IMavenProjectFacade projectFacade,
MojoExecution execution,
IPluginExecutionMetadata executionMetadata) {
return new AntlrBuildParticipant(execution);
}
}
</pre><p>The follow extension in plugin.xml registers ANTLR project configurator with m2e</p>
<pre class="prettyprint linenums">
&lt;extension point=&quot;org.eclipse.m2e.core.projectConfigurators&quot;&gt;
&lt;configurator
class=&quot;org.sonatype.m2e.antlr.internal.AntlrProjectConfigurator&quot;
id=&quot;org.sonatype.m2e.antlr.antlrConfigurator&quot;
name=&quot;ANTLR Project Configurator&quot;&gt;
&lt;/configurator&gt;
&lt;/extension&gt;
</pre><p>lifecycle-mapping-metadata.xml located at the root of the project (and at the root of OSGi bundle jar at runtime) maps antlr3-maven-plugin antlr goal to ANTLR project configurator. Note that configurator id in the mapping matches configurator id defined in the extension point above.</p>
<pre class="prettyprint linenums">
&lt;lifecycleMappingMetadata&gt;
   &lt;pluginExecutions&gt;
     &lt;pluginExecution&gt;
       &lt;pluginExecutionFilter&gt;
         &lt;groupId&gt;org.antlr&lt;/groupId&gt;
         &lt;artifactId&gt;antlr3-maven-plugin&lt;/artifactId&gt;
         &lt;versionRange&gt;[3.1.1,)&lt;/versionRange&gt;
          &lt;goals&gt;
            &lt;goal&gt;antlr&lt;/goal&gt;
          &lt;/goals&gt;
       &lt;/pluginExecutionFilter&gt;
       &lt;action&gt;
         &lt;configurator&gt;
           &lt;id&gt;org.sonatype.m2e.antlr.antlrConfigurator&lt;/id&gt;
         &lt;/configurator&gt;
       &lt;/action&gt;
     &lt;/pluginExecution&gt;
   &lt;/pluginExecutions&gt;
&lt;/lifecycleMappingMetadata&gt;
</pre><p>And finally, the following extension in plugin.xml registers m2e extension as lifecycle mapping metadata source with m2e. This is mostly needed as performance optimization, because without this extension m2e would have to search lifecycle-mapping-metadata.xml file in all installed eclipse plugins.</p>
<pre class="prettyprint linenums">
&lt;extension
point=&quot;org.eclipse.m2e.core.lifecycleMappingMetadataSource&quot;&gt;
&lt;/extension&gt;
</pre><h3><a href="https://github.com/sonatype/m2eclipse-extras/blob/0.13.0.20110622-1538/org.sonatype.m2e.antlr/src/org/sonatype/m2e/antlr/internal/AntlrBuildParticipant.java">AntlrBuildParticipant</a></h3><p>AntlrBuildParticipant generates java source files (any resources generated by ANTLR, to be precise) during eclipse incremental and full builds.</p><p>First AntlrBuildParticipant checks if any of the grammar files have changed and short-cuts code generation if there were no changes.</p>
<pre class="prettyprint linenums">
File source = maven.getMojoParameterValue(getSession(), getMojoExecution(), &quot;sourceDirectory&quot;, File.class);
  Scanner ds = buildContext.newScanner( source ); // delta or full scanner
  ds.scan();
  String[] includedFiles = ds.getIncludedFiles();
  if (includedFiles == null || includedFiles.length &lt;= 0 ) {
   return null;
  }
</pre><p>Then, AntlrBuildParticipant delegates to MojoExecutionBuildParticipant.build to execute antlr3-maven-plugin antlr goal. This generates resources on filesystem, but does not update eclipse workspace</p>
<pre class="prettyprint linenums">
       Set&lt;IProject&gt; result = super.build( kind, monitor );
Finally, AntlrBuildParticipant refreshes generation output folder in
workspace
       File generated = maven.getMojoParameterValue(getSession(), getMojoExecution(), &quot;outputDirectory&quot;, File.class);
       if (generated != null) {
           buildContext.refresh( generated );
       }
</pre><h3><a href="#testing-m2e-antlr-code-generation-support" name="testing-m2e-antlr-code-generation-support">Testing m2e/antlr code generation support</a></h3><p><a href="https://github.com/sonatype/m2eclipse-extras/tree/0.13.0.20110622-1538/org.sonatype.m2e.antlr.tests/projects/antlr/antlr-v3-p001">Test project</a> is setup to fail java compilation if workspace project source folders were not properly configured or ANTLR code generation did not succeed for whatever reason. <a href="https://github.com/sonatype/m2eclipse-extras/blob/0.13.0.20110622-1538/org.sonatype.m2e.antlr.tests/src/org/sonatype/m2e/antlr/tests/AntlrGenerationTest.java">AntlrGenerationTest.java</a> performs very basic tests to make sure that m2e/antlrv3 integration is not obviously broken.</p><p>Import the test project and wait for all background processing triggered by the new project to finish. Even though the test does not assert this, the workspace project should be fully configured at this point</p>
<dl><dt><code>
       ResolverConfiguration configuration = new ResolverConfiguration();
       IProject project1 = importProject( &quot;projects/antlr/antlr-v3-p001/pom.xml&quot;, configuration );
       waitForJobsToComplete();
</code></dt><dd><p>To make sure no state is retained from one test run to the next,</p><h1><a href="#importproject-always-creates-new-fresh-copy-of-the-test-project" name="importproject-always-creates-new-fresh-copy-of-the-test-project">importProject always creates new/fresh copy of the test project</a></h1><p>under target/test workspace location; the copy is removed by the test tearDown logic.</p></dd>
</dl><p>Automatic workspace build is disable during m2e extensions tests by default, so the build needs to be run explicitly from the test code.</p>
<dl><dt><code>
       project1.build( IncrementalProjectBuilder.FULL_BUILD, monitor );
       project1.build( IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor );
       waitForJobsToComplete();
</code>       </dt><dd><p>Note that there are two calls to IProject.build. First, full, build will generate the code. Second, incremental, build will give JDT Java builder the chance to compile the generated code. This matches how java code generation is handled by a &ldquo;real&rdquo; eclipse workspace, so it is therefore important that AntlrBuildParticipant performs code generation only when source grammar files change, otherwise workspace build will keep restarting itself forever.</p></dd>
</dl><p>At this point the project should be fully configured, the code should be generated and both generated code should be compiled without errors. Lets assert all that</p>
<pre class="prettyprint linenums">
       assertNoErrors( project1 );
       IJavaProject javaProject1 = JavaCore.create( project1 );
       IClasspathEntry[] cp1 = javaProject1.getRawClasspath();
       assertEquals( new Path( &quot;/antlr-p001/target/generated-sources/antlr&quot; ), cp1[3].getPath() );
       assertTrue( project1.getFile( &quot;target/generated-sources/antlr/test/SampleParser.java&quot; ).isSynchronized( IResource.DEPTH_ZERO ) );
       assertTrue( project1.getFile( &quot;target/generated-sources/antlr/test/SampleParser.java&quot; ).isAccessible() );
</pre><p>TODO add code to assert that expected .class files were created</p><h2><a href="#building-the-code-and-generating-p2-repository" name="building-the-code-and-generating-p2-repository">Building the code and generating p2 repository</a></h2><p>This section is not meant as a substitute for Tycho tutorials and documentation, but rather as suggested m2e extension source tree layout and build setup. Explanation is based on <a href="https://github.com/sonatype/m2eclipse-egit/tree/0.13.0.20110628-2018">m2eclipse-egit</a> project.</p><h3><a href="#project-directory-structure-overview" name="project-directory-structure-overview">Project directory structure overview</a></h3>
<pre class="prettyprint linenums">
 m2eclipse-egit/                      &lt;= project basedir, all project files are under this directory
   org.sonatype.m2e.egit/             &lt;= main bundle project
     src/
     pom.xml
   org.sonatype.m2e.egit.feature/     &lt;= eclipse feature project
     src/
     pom.xml
   org.sonatype.m2e.egit.tests/       &lt;= automated tests (optional, but highly recommended)
     feature.xml
     pom.xml
   pom.xml                            &lt;= aggregator/parent pom.xml
</pre><h3>Parent pom.xml</h3><p>This pom.xml snippet tells Maven to enable Tycho for all modules of this project.</p>
<pre class="prettyprint linenums">
 ...
 &lt;build&gt;
   &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;
 ...
</pre><p>This snippet configures p2 repositories that will be used to resolve project dependencies. Indigo release repository does not include m2e org.eclipse.m2e.tests.common, so m2e release repository is specified separately.</p>
<pre class="prettyprint linenums">
 ...
 &lt;repositories&gt;
   &lt;repository&gt;
     &lt;id&gt;eclipse&lt;/id&gt;
     &lt;url&gt;[http://download.eclipse.org/releases/indigo](http://download.eclipse.org/releases/indigo)&lt;/url&gt;
     &lt;layout&gt;p2&lt;/layout&gt;
   &lt;/repository&gt;
   &lt;repository&gt;
     &lt;id&gt;m2e&lt;/id&gt;
     &lt;url&gt;[http://download.eclipse.org/technology/m2e/releases/1.0](http://download.eclipse.org/technology/m2e/releases/1.0)&lt;/url&gt;
     &lt;layout&gt;p2&lt;/layout&gt;
   &lt;/repository&gt;
 &lt;/repositories&gt;
 ...
</pre><h3>org.sonatype.m2e.egit and org.sonatype.m2e.egit.tests</h3><p>org.sonatype.m2e.egit and org.sonatype.m2e.egit.tests are conventional PDE Plug-In projects and only requires minimal pom.xml file.</p>
<pre class="prettyprint linenums">
 &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
   &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
 
   &lt;parent&gt;
     &lt;groupId&gt;org.sonatype.m2e.egit&lt;/groupId&gt;
     &lt;artifactId&gt;org.sonatype.m2e.egit.parent&lt;/artifactId&gt;
     &lt;version&gt;0.14.0-SNAPSHOT&lt;/version&gt;
   &lt;/parent&gt;
 
   &lt;artifactId&gt;org.sonatype.m2e.egit&lt;/artifactId&gt;
   &lt;packaging&gt;eclipse-plugin&lt;/packaging&gt;
 
   &lt;name&gt;Maven SCM Handler for EGit Plug-in&lt;/name&gt;
 
 &lt;/project&gt;
</pre><p>There is, however, tycho-surefire-plugin configuration in the parent pom that affects test execution.</p><h3>org.sonatype.m2e.egit.feature</h3><p>org.sonatype.m2e.egit.feature is a PDE Feature project and it serves two purposes. It defines Eclipse Feature that can be installed using p2 installation GUI (it is not possible to install individual bundles). It also generates and optionally deploys to a remote server p2 repository containing the feature and the main bundle.</p><p>feature.xml, feature.properties and license.html files in the root of the project define contents of the feature. This is standard eclipse fare and regular PDE documentation fully applies. Beware that a feature must provide correct license information to be accepted to m2e marketplace catalog.</p><p>p2 repository generation is configured in pom.xml with additional configuration provided via category.xml file located in the root of the project. Additionally, repository zip file contents is controlled by src/main/assembly/assembly.xml.</p><p>Specifically</p><p>Aggregate feature&rsquo;s &ldquo;included&rdquo; dependencies under conventional target/site directory.</p>
<pre class="prettyprint linenums">
     &lt;plugin&gt;
       &lt;groupId&gt;org.eclipse.tycho&lt;/groupId&gt;
       &lt;artifactId&gt;tycho-packaging-plugin&lt;/artifactId&gt;
       &lt;version&gt;${tycho-version}&lt;/version&gt;
       &lt;configuration&gt;
         &lt;deployableFeature&gt;true&lt;/deployableFeature&gt;
       &lt;/configuration&gt;
     &lt;/plugin&gt;
</pre><p>Generate p2 repository metadata for artifacts collected in target/site.</p>
<pre class="prettyprint linenums">
     &lt;plugin&gt;
       &lt;groupId&gt;org.eclipse.tycho&lt;/groupId&gt;
       &lt;artifactId&gt;tycho-p2-plugin&lt;/artifactId&gt;
       &lt;version&gt;${tycho-version}&lt;/version&gt;
       &lt;executions&gt;
         &lt;execution&gt;
           &lt;id&gt;categorization&lt;/id&gt;
           &lt;phase&gt;package&lt;/phase&gt;
           &lt;goals&gt;
             &lt;goal&gt;category-p2-metadata&lt;/goal&gt;
           &lt;/goals&gt;
         &lt;/execution&gt;
       &lt;/executions&gt;
       &lt;configuration&gt;
         &lt;metadataRepositoryName&gt;Maven SCM Handler for EGit&lt;/metadataRepositoryName&gt;
         &lt;artifactRepositoryName&gt;Maven SCM Handler for EGit&lt;/artifactRepositoryName&gt;
       &lt;/configuration&gt;
     &lt;/plugin&gt;
</pre><p>By convention, p2 repository category information comes from category.xml file.</p>
<pre class="prettyprint linenums">
 &lt;site&gt;
    &lt;feature url=&quot;features/org.sonatype.m2e.egit.feature_0.0.0.qualifier.jar&quot; id=&quot;org.sonatype.m2e.egit.feature&quot; version=&quot;0.0.0.qualifier&quot;&gt;
       &lt;category name=&quot;m2eclipse-egit&quot;/&gt;
    &lt;/feature&gt;
    &lt;category-def name=&quot;m2eclipse-egit&quot; label=&quot;Maven SCM Handler for EGit&quot;/&gt;
 &lt;/site&gt;
</pre><p>Create p2 repository zip file.</p>
<pre class="prettyprint linenums">
     &lt;plugin&gt;
       &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
       &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;
       &lt;configuration&gt;
         &lt;descriptors&gt;
           &lt;descriptor&gt;src/main/assembly/assembly.xml&lt;/descriptor&gt;
         &lt;/descriptors&gt;
       &lt;/configuration&gt;
       &lt;executions&gt;
         &lt;execution&gt;
           &lt;id&gt;make-assembly&lt;/id&gt; 
           &lt;phase&gt;package&lt;/phase&gt; 
           &lt;goals&gt;
             &lt;goal&gt;single&lt;/goal&gt; 
           &lt;/goals&gt;
         &lt;/execution&gt;
       &lt;/executions&gt;
     &lt;/plugin&gt;
</pre><p>&hellip; using assembly descriptor src/main/assembly/assembly.xml</p>
<pre class="prettyprint linenums">
 &lt;assembly&gt;
   &lt;id&gt;site&lt;/id&gt;
   &lt;formats&gt;
     &lt;format&gt;zip&lt;/format&gt;
   &lt;/formats&gt;
   &lt;includeBaseDirectory&gt;false&lt;/includeBaseDirectory&gt;
   &lt;fileSets&gt;
     &lt;fileSet&gt;
       &lt;directory&gt;${project.build.directory}/site&lt;/directory&gt;
       &lt;outputDirectory&gt;/&lt;/outputDirectory&gt;
     &lt;/fileSet&gt;
   &lt;/fileSets&gt;
 &lt;/assembly&gt;
</pre><h3><a href="#publishing-p2-repository" name="publishing-p2-repository">Publishing p2 repository</a></h3><p>TBD</p>
<hr/>
</div>
</div>
</div><!-- END container -->
</div><!-- END wrap -->
<div class="stickyFooter">
<div class="footer">
<div class="container">
<div class="row">
<div class="col-md-4 md-margin-bottom-40"></div><!--/col-md-4-->
<div class="col-md-4 md-margin-bottom-40"> </div>
<div class="col-md-4">
</div>
</div>
</div>
</div>
<div class="copyright">
<div class="container">
<div class="row">
<div class="col-md-6">
<p class="copyright-space">
<a href="https://www.eclipse.org/">Home</a> | <a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a> | <a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a> | <a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a> | <a href="https://www.eclipse.org/legal/">Legal</a> | <a href="https://www.eclipse.org/org/foundation/contact.php">Contact Us</a>
</p>
</div>
<div class="col-md-6" align="right">
<p class="copyright-space">
Copyright &copy;
2015 The Eclipse Foundation. All Rights Reserved.
</p>
</div>
</div>
</div>
</div>
</div>
<!-- JS Global Compulsory -->
<script type="text/javascript" src="/m2e/assets/plugins/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="/m2e/assets/plugins/jquery-migrate-1.2.1.min.js"></script>
<script type="text/javascript" src="/m2e/assets/plugins/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/m2e/assets/plugins/hover-dropdown.min.js"></script>
<script type="text/javascript" src="/m2e/assets/plugins/back-to-top.js"></script>
<!-- TESTING JS -->
<script type="text/javascript" src="/m2e/assets/plugins/app.js"></script>
<script type="text/javascript">
jQuery(document).ready(function() {
App.init();
});
</script>
<!--[if lt IE 9]>
<script src="/m2e/assets/plugins/respond.js"></script>
<![endif]-->
</body>
</html>