blob: 6c38dead82afd40460f42e330d9a5d03b8eeaba9 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-112407000-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-112407000-2');
</script>
<!-- Google Tag Manager -->
<script>
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
'gtm.start': new Date().getTime(),
event: 'gtm.js'
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src =
'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-KS8HHSF');
</script>
<!-- End Google Tag Manager -->
<head>
<title>Getting Started with Codewind in VS Code | Codewind</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Take advantage of Codewind&#39;s tools to help build high quality cloud native applications regardless of which IDE or language you use.">
<meta name="keywords" content="Codewind, VS Code, microservice"/>
<link rel="icon" type="image/png" sizes="16x16" href="images/favicon/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="images/favicon/favicon-32x32.png">
<link href="https://fonts.googleapis.com/css?family=IBM+Plex+Sans:300,400,600&display=swap" rel="stylesheet">
<!-- Bootstrap CSS CDN -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<link rel="stylesheet" href="css/styles.css">
<link rel="stylesheet" href="css/docs.css">
<link rel="stylesheet" href="css/learn.css">
<link rel="stylesheet" href="css/blog.css">
<link rel="stylesheet" href="css/guides.css">
<link rel="stylesheet" href="css/search.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/themes/prism.min.css">
</head>
<body data-spy="scroll" data-target="#toc">
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KS8HHSF"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div class="main">
<!-- Bootstrap NavBar -->
<nav class="navbar navbar-expand-xl navbar-light cw-banner fixed-top" aria-label="topnav">
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse"
data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<a class="navbar-brand" href="/codewind/">
<img alt="Codewind logo image" title="Codewind logo image" src="images/header/header-logo.svg" class="cw-header-logo" alt="">
</a>
<div class="collapse navbar-collapse justify-content-end cw-navbar-padding" id="navbarNavDropdown">
<ul class="navbar-nav cw-navbar-nav">
<li class="nav-item cw-navbar-item cw-header-link-docs">
<a class="nav-link cw-nav-link cw-header-link-text" href="learn.html">Learn</a>
</li>
<li class="nav-item cw-navbar-item cw-header-link-news">
<a class="nav-link cw-nav-link cw-header-link-text" href="news.html">News</a>
</li>
<li class="nav-item cw-navbar-item cw-header-link-blog">
<a class="nav-link cw-nav-link cw-header-link-text" href="blog.html">Blog</a>
</li>
<li class="nav-item cw-navbar-item cw-header-link-guides">
<a class="nav-link cw-nav-link cw-header-link-text" href="guides.html">Guides</a>
</li>
<form class="form-inline my-2 my-lg-0 cw-navbar-item" action="/codewind/search.html" method="get">
<svg class="bi bi-search" width="1em" height="1em" viewBox="0 0 16 16" fill="black" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M10.442 10.442a1 1 0 011.415 0l3.85 3.85a1 1 0 01-1.414 1.415l-3.85-3.85a1 1 0 010-1.415z" clip-rule="evenodd"/>
<path fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 100-11 5.5 5.5 0 000 11zM13 6.5a6.5 6.5 0 11-13 0 6.5 6.5 0 0113 0z" clip-rule="evenodd"/>
</svg>
<input id="nav-search" class="form-control mr-sm-2" type="text" id="search-box" name="query" placeholder="Search">
</form>
<li class="nav-item cw-navbar-item cw-header-link">
<a class="nav-link cw-nav-link" href="https://github.com/eclipse/codewind"><img alt="Codewind Github" class="banner-image" title="Codewind Github" data-toggle="tooltip" data-placement="top" id="cw_github_stars" title="..." src="images/header/github.svg"/></a>
</li>
<li class="nav-item cw-navbar-item cw-header-link">
<a class="nav-link cw-nav-link" href="https://twitter.com/EclipseCodewind"><img alt="Codewind Twitter" class="banner-image" title="Codewind Twitter" src="images/header/twitter.png"/></a>
</li>
<li class="nav-item cw-navbar-item cw-header-link">
<a class="nav-link cw-nav-link" href="https://mattermost.eclipse.org/eclipse/channels/eclipse-codewind"><img alt="Codewind Mattermost" class="banner-image" title="Codewind Mattermost" src="images/header/mattermost.png"/></a>
</li>
<li class="nav-item cw-navbar-item cw-header-link">
<a class="nav-link cw-nav-link" href="https://www.youtube.com/channel/UCnKCVK6RFDyHFqUmXlAhCHQ"><img alt="Codewind YouTube" class="banner-image" title="Codewind YouTube" src="images/header/youtube.png"/></a>
</li>
<!-- li class="nav-item cw-navbar-item" id="download-li">
<button onClick="window.location.href='https://microclimate.dev/download/codewind';" type="button" class="btn cw-download-button">Download</button>
<a href="https://microclimate.dev/download/codewind" class="nav-link cw-nav-link cw-download-link" href="#">Download</a>
</li> -->
<!-- Smaller devices menu END -->
</ul>
</div>
</nav>
<!-- End Bootstrap NavBar -->
<div class="row" id="post-row">
<div class="col-xs-12 col-lg-1"></div>
<div class="py-5 px-5 col-xs-12 col-lg-10">
<div class="cw-blog-spacer"></div>
<div id="post-content">
<h1>Getting Started with Codewind in VS Code</h1>
<!--<p>13 Aug 2020</p>-->
<p>Take advantage of Codewind's tools to help build high quality cloud native applications regardless of which IDE or language you use.</p>
<h2>Objectives</h2>
<ul>
<li>
Install Visual Studio Code (VS Code) and Codewind.
</li>
<li>
Develop a simple microservice that uses Eclipse Codewind in VS Code.
</li>
</ul>
<div role="main"><h2 id="overview">Overview</h2>
<p>Use Eclipse Codewind to create application projects from Application Stacks that your company builds. With Codewind, you can focus on your code and not on infrastructure and Kubernetes. Application deployments to Kubernetes occur through pipelines when developers commit their local code to the correct Git repos Kabanero is managing through webhooks.</p>
<p>Use Codewind to create projects based on different template types. These projects include IBM Cloud Starters, OpenShift Do (odo), and Appsody templates. Today, there are templates for IBM Cloud Starters, odo, Eclipse MicroProfile/Java EE, Spring Boot, Node.js, Node.js with Express, and Node.js with Loopback.</p>
<h2 id="developing-with-vs-code">Developing with VS Code</h2>
<p>Keep your current workflow and use Codewind for VS Code to develop and debug your containerized projects from within the IDE.</p>
<h3 id="prerequisite">Prerequisite</h3>
<p>Before you can develop a microservice with VS Code, you need to:</p>
<ul>
<li><a href="https://docs.docker.com/install/">Install Docker</a>
<ul>
<li><strong>Note:</strong> Make sure to install or upgrade to minimum Docker version 19.03.</li>
</ul>
</li>
<li><a href="https://code.visualstudio.com/download">Install VS Code</a></li>
</ul>
<h3 id="installing-codewind-for-vs-code">Installing Codewind for VS Code</h3>
<p>The Codewind installation pulls the following images that form the Codewind backend:</p>
<ol>
<li><code class="highlighter-rouge">eclipse/codewind-performance-amd64</code></li>
<li><code class="highlighter-rouge">eclipse/codewind-pfe-amd64</code></li>
</ol>
<p>The Codewind installation includes two parts:</p>
<ol>
<li>The VS Code extension installs when you install Codewind from the <a href="https://marketplace.visualstudio.com/items?itemName=IBM.codewind">VS Code Marketplace</a> and click <strong>Install</strong>.
<ul>
<li>Or, go to <strong>View</strong>&gt;<strong>Extensions</strong>, search for Codewind, and click <strong>Install</strong>.</li>
</ul>
</li>
<li>The Codewind backend containers install after you click <strong>Install</strong> when you are prompted. Clicking <strong>Install</strong> downloads the Codewind backend containers, approximately 1GB.
<ul>
<li><strong>Optional:</strong> If you don’t click <strong>Install</strong> when the notification window appears, access the notification again. Go to <strong>View</strong>&gt;<strong>Explorer</strong>. Then, click <strong>Codewind</strong> and hover the cursor over <strong>Codewind</strong> where there is a switch to turn Codewind on or off. Click the switch so that it is <strong>On</strong>. The notification window is displayed.</li>
</ul>
</li>
</ol>
<h3 id="configuring-codewind-to-use-application-stacks">Configuring Codewind to use application stacks</h3>
<p>Configure Codewind to use Appsody templates so you can focus exclusively on your code. These templates include an Eclipse MicroProfile stack that you can use to follow this guide. Complete the following steps to select the Appsody templates:</p>
<ol>
<li>Under the Explorer pane, select <strong>Codewind</strong>.</li>
<li>Right-click <strong>Local</strong>.</li>
<li>Select <strong>Template Source Manager</strong>.</li>
<li>Enable <strong>Appsody Stacks - incubator</strong>.</li>
</ol>
<p>After you configure Codewind to use Appsody templates, continue to develop your microservice within Codewind.</p>
<p>If your organization uses customized application stacks and gives you a URL that points to an <code class="highlighter-rouge">index.json</code> file, you can add it to Codewind:</p>
<ol>
<li>Return to <strong>Codewind</strong>` and right-click <strong>Local</strong>.</li>
<li>Select <strong>Template Source Manager</strong>.</li>
<li>Click <strong>Add New +</strong> to add your URL.</li>
<li>Add your URL in the pop-up window and save your changes.</li>
</ol>
<h3 id="creating-an-appsody-project">Creating an Appsody project</h3>
<p>Throughout the application lifestyle, Appsody helps you develop containerized applications and maximize containers curated for your usage. If you want more context about Appsody, see the <a href="https://appsody.dev/docs">Appsody welcome page</a>.</p>
<ol>
<li>Under the Explorer pane, select <strong>Codewind</strong>.</li>
<li>Expand <strong>Codewind</strong> by clicking the drop-down arrow.</li>
<li>Hover over the <strong>Projects</strong> entry in the Explorer pane and press the <strong>+</strong> icon to create a project.
<ul>
<li><strong>Note:</strong> Make sure that Docker is running. Otherwise, you get an error.</li>
</ul>
</li>
<li>Choose the <strong>Appsody Open Liberty default template (Appsody Stacks - incubator)</strong>.</li>
<li>Name your project <strong>appsody-calculator</strong>.
<ul>
<li>If you don’t see Appsody templates, find and select <strong>Template Source Manager</strong> and enable <strong>Appsody Stacks - incubator</strong>.</li>
<li>The templates are refreshed, and the Appsody templates are available.</li>
</ul>
</li>
<li>Press <strong>Enter</strong>.
<ul>
<li>To monitor your project’s progress, right-click your project and select <strong>Show all logs</strong>. Then, an <strong>Output</strong> tab is displayed where you see your project’s build logs.</li>
</ul>
</li>
</ol>
<p>Your project is complete when you see that your application status is running and your build status is successful.</p>
<h3 id="accessing-the-application-endpoint-in-a-browser">Accessing the application endpoint in a browser</h3>
<ol>
<li>Return to your project under the Explorer pane.</li>
<li>Select the Open App icon next to your project’s name, or right-click your project and select <strong>Open App</strong>.</li>
</ol>
<p>Your application is now opened in a browser, showing the welcome to your Appsody microservice page.</p>
<h3 id="adding-a-rest-service-to-your-application">Adding a REST service to your application</h3>
<ol>
<li>Go to your project’s workspace under the Explorer tab.</li>
<li>Go to <code class="highlighter-rouge">src/main/java/dev/appsody/starter</code>.</li>
<li>Right-click <strong>starter</strong> and select <strong>New File</strong>.</li>
<li>Create a file, name it <code class="highlighter-rouge">Calculator.java</code>, and press <strong>Enter</strong>. This file is your JAX-RS resource.</li>
<li>Before you input any code, make sure that the file is empty.</li>
<li>Populate the file with the following code and then <strong>save</strong> the file:</li>
</ol>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">package</span> <span class="n">dev</span><span class="o">.</span><span class="na">appsody</span><span class="o">.</span><span class="na">starter</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.ws.rs.core.Application</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.ws.rs.GET</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.ws.rs.Path</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.ws.rs.Produces</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.ws.rs.core.MediaType</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.ws.rs.core.Response</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.ws.rs.PathParam</span><span class="o">;</span>
<span class="nd">@Path</span><span class="o">(</span><span class="s">"/calculator"</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Calculator</span> <span class="kd">extends</span> <span class="nc">Application</span> <span class="o">{</span>
<span class="nd">@GET</span>
<span class="nd">@Path</span><span class="o">(</span><span class="s">"/aboutme"</span><span class="o">)</span>
<span class="nd">@Produces</span><span class="o">(</span><span class="nc">MediaType</span><span class="o">.</span><span class="na">TEXT_PLAIN</span><span class="o">)</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">aboutme</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">"You can add (+), subtract (-), and multiply (*) with this simple calculator."</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@GET</span>
<span class="nd">@Path</span><span class="o">(</span><span class="s">"/{op}/{a}/{b}"</span><span class="o">)</span>
<span class="nd">@Produces</span><span class="o">(</span><span class="nc">MediaType</span><span class="o">.</span><span class="na">TEXT_PLAIN</span><span class="o">)</span>
<span class="kd">public</span> <span class="nc">Response</span> <span class="nf">calculate</span><span class="o">(</span><span class="nd">@PathParam</span><span class="o">(</span><span class="s">"op"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">op</span><span class="o">,</span> <span class="nd">@PathParam</span><span class="o">(</span><span class="s">"a"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">a</span><span class="o">,</span> <span class="nd">@PathParam</span><span class="o">(</span><span class="s">"b"</span><span class="o">)</span> <span class="nc">String</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">numA</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">a</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">numB</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">b</span><span class="o">);</span>
<span class="k">switch</span> <span class="o">(</span><span class="n">op</span><span class="o">)</span> <span class="o">{</span>
<span class="k">case</span> <span class="s">"+"</span><span class="o">:</span>
<span class="k">return</span> <span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">(</span><span class="n">a</span> <span class="o">+</span> <span class="s">"+"</span> <span class="o">+</span> <span class="n">b</span> <span class="o">+</span> <span class="s">"="</span> <span class="o">+</span> <span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">((</span><span class="n">numA</span> <span class="o">+</span> <span class="n">numB</span><span class="o">)))).</span><span class="na">build</span><span class="o">();</span>
<span class="k">case</span> <span class="s">"-"</span><span class="o">:</span>
<span class="k">return</span> <span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">(</span><span class="n">a</span> <span class="o">+</span> <span class="s">"-"</span> <span class="o">+</span> <span class="n">b</span> <span class="o">+</span> <span class="s">"="</span> <span class="o">+</span> <span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">((</span><span class="n">numA</span> <span class="o">-</span> <span class="n">numB</span><span class="o">)))).</span><span class="na">build</span><span class="o">();</span>
<span class="k">case</span> <span class="s">"*"</span><span class="o">:</span>
<span class="k">return</span> <span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">(</span><span class="n">a</span> <span class="o">+</span> <span class="s">"*"</span> <span class="o">+</span> <span class="n">b</span> <span class="o">+</span> <span class="s">"="</span> <span class="o">+</span> <span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">((</span><span class="n">numA</span> <span class="o">*</span> <span class="n">numB</span><span class="o">)))).</span><span class="na">build</span><span class="o">();</span>
<span class="k">default</span><span class="o">:</span>
<span class="k">return</span> <span class="nc">Response</span><span class="o">.</span><span class="na">ok</span><span class="o">(</span><span class="s">"Invalid operation. Please Try again"</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>Any changes that you make to your code are automatically built and redeployed by Codewind, and you can view them in your browser.</p>
<h3 id="working-with-the-example-calculator-microservice">Working with the example calculator microservice</h3>
<p>You now can work with the example calculator microservice.</p>
<ol>
<li>Use the port number that you saw when you first opened the application.</li>
<li>Make sure to remove the <code class="highlighter-rouge">&lt; &gt;</code> symbol in the URL.</li>
<li><code class="highlighter-rouge">http://127.0.0.1:&lt;port&gt;/starter/calculator/aboutme</code></li>
<li>You see the following response:</li>
</ol>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>You can add (+), subtract (-), and multiply (*) with this simple calculator.
</code></pre></div></div>
<p>You can also try a few of the sample calculator functions:</p>
<ul>
<li><code class="highlighter-rouge">http://127.0.0.1:&lt;port&gt;/starter/calculator/{op}/{a}/{b}</code>, where you can input one of the available operations <code class="highlighter-rouge">(+, _, *</code>, and an integer a, and an integer b.</li>
<li>So for <code class="highlighter-rouge">http://127.0.0.1:&lt;port&gt;/starter/calculator/+/10/3</code> you see: <code class="highlighter-rouge">10+3=13</code>.</li>
</ul>
<h2 id="what-you-have-learned">What you have learned</h2>
<p>Now that you have completed this quick guide, you have learned to:</p>
<ol>
<li>Install Codewind on VS Code</li>
<li>Develop your own microservice that uses Codewind</li>
</ol>
<h2 id="next-steps">Next Steps</h2>
<p>See other quick guides to learn how to develop with Codewind:</p>
<ul>
<li><a href="codewind-eclipse-quick-guide.html">Codewind in Eclipse</a></li>
</ul>
</div>
</div>
</div>
<div class="col-xs-12 col-lg-1"></div>
</div>
<!-- footer row -->
<footer>
<div id="footer-div-mobile">
<div class="row">
<div class="col-sm-12 text-center">
<span>Useful Links:</span>
<br/><br/>
<a class="cw-footer-links" href="http://www.eclipse.org">Eclipse Foundation</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal/termsofuse.php">Website Terms of Use</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal">Legal</a><br/>
</div>
</div>
<div class="cw_footer_display_flex cw-footer-same-height cw-footer-center">
<div class="cw_footer_display_icons row">
<div class="cw-footer-col text-center col-md-3 col-sm-6 col-xs-12">
<div>
<div>
<a href="mailto:codewind-dev@eclipse.org"><img alt="Send us an email" title="Send us an email" src="images/footer/email-icon.svg" class="cw-logo" /></a>
</div>
</div>
</div>
<div class="cw-footer-col text-center col-md-3 col-sm-6 col-xs-12">
<div>
<div>
<a href="https://twitter.com/EclipseCodewind"><img alt="Codewind Twitter" title="Codewind Twitter" src="images/footer/twitter-logo.svg" class="cw-logo" /></a>
</div>
</div>
</div>
<div class="cw-footer-col text-center col-md-3 col-sm-6 col-xs-12">
<div>
<div>
<a href="https://github.com/eclipse/codewind"><img alt="Codewind Github" title="Codewind Github" src="images/footer/github-logo.svg"
class="cw-logo" /></a>
</div>
</div>
</div>
<div class=" cw-footer-col text-center col-md-3 col-sm-6 col-xs-12">
<div>
<div>
<a href="https://mattermost.eclipse.org/eclipse/channels/eclipse-codewind"><img alt="Codewind Mattermost" title="Codewind Mattermost" src="images/footer/mattermost-logo.png" class="cw-logo-mm" /></a>
</div>
</div>
</div>
<div class="cw-footer-col text-center col-md-3 col-sm-6 col-xs-12">
<div>
<div>
<a href="https://www.youtube.com/channel/UCnKCVK6RFDyHFqUmXlAhCHQ"><img alt="Codewind YouTube" title="Codewind YouTube" src="images/footer/youtube-logo-dark.svg"
class="cw-logo" /></a>
</div>
</div>
</div>
<div class="cw-footer-col text-center col-md-3 col-sm-6 col-xs-12">
<div>
<div>
<a href="http://www.eclipse.org"><img class="cw-logo-eclipse-mobile" alt="Eclipse" title="Eclipse" src="images/footer/eclipse.svg"/></a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row cw-footer-desktop" id="footer-div">
<div class="cw-footer-left">
<div class="px-5 cw-font-12>
<span class="cw-font-14">Useful Links:</span>
<br/><br/>
<a class="cw-footer-links" href="http://www.eclipse.org">Eclipse Foundation</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal/termsofuse.php">Website Terms of Use</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a><br/>
<a class="cw-footer-links" href="http://www.eclipse.org/legal">Legal</a><br/>
</div>
</div>
<div class="cw-footer-border-right"></div>
<div class="cw_footer_display_flex cw-footer-same-height cw-footer-center">
<div class="cw_footer_display_icons">
<div class="cw-footer-col text-center">
<div>
<div>
<a href="mailto:codewind-dev@eclipse.org"><img alt="Send us an email" title="Send us an email" src="images/footer/email-icon.svg" class="cw-logo" /></a>
</div>
</div>
</div>
<div class="cw-footer-col text-center">
<div>
<div>
<a href="https://twitter.com/EclipseCodewind"><img alt="Codewind Twitter" title="Codewind Twitter" src="images/footer/twitter-logo.svg" class="cw-logo" /></a>
</div>
</div>
</div>
<div class="cw-footer-col text-center">
<div>
<div>
<a href="https://github.com/eclipse/codewind"><img alt="Codewind Github" title="Codewind Github" src="images/footer/github-logo.svg"
class="cw-logo" /></a>
</div>
</div>
</div>
<div class=" cw-footer-col text-center">
<div class="cw-logo-mm" >
<div class="cw-logo-mm" >
<a href="https://mattermost.eclipse.org/eclipse/channels/eclipse-codewind"><img alt="Codewind Mattermost" title="Codewind Mattermost" src="images/footer/mattermost-logo.png" class="cw-logo-mm" /></a>
</div>
</div>
</div>
<div class="cw-footer-col text-center">
<div>
<div>
<a href="https://www.youtube.com/channel/UCnKCVK6RFDyHFqUmXlAhCHQ"><img alt="Codewind YouTube" title="Codewind YouTube" src="images/footer/youtube-logo-dark.svg"
class="cw-logo" /></a>
</div>
</div>
</div>
</div>
</div>
<div class="cw-footer-border-right"></div>
<div class="cw-footer-right cw-footer-same-height cw-footer-vcenter">
<div class="cw-footer-eclipse-img cw-footer-same-height px-5 ">
<a href="http://www.eclipse.org">
<img alt="Eclipse" title="Eclipse" src="images/footer/eclipse.svg"/>
</a>
</div>
</div>
</div>
</footer>
<!-- footer row END -->
<!-- Jquery -->
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous">
</script>
<!-- Font Awesome JS -->
<script defer src="https://use.fontawesome.com/releases/v5.0.13/js/solid.js"
integrity="sha384-tzzSw1/Vo+0N5UhStP3bvwWPq+uvzCMfrN1fEFe+xBmv1C/AtVX5K0uZtmcHitFZ" crossorigin="anonymous">
</script>
<script defer src="https://use.fontawesome.com/releases/v5.0.13/js/fontawesome.js"
integrity="sha384-6OIrr52G08NpOFSZdxxz1xdNSndlD4vdcf/q2myIUVO0VsqaGHJsB0RaBE01VTOY" crossorigin="anonymous">
</script>
<script src="js/jquery.matchHeight-min.js"></script>
<script src="js/index.js"></script>
<script src="js/docs.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/components/prism-docker.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/components/prism-json.min.js"></script>
</div>
</body>
</html>