<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--

    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

       https://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
  <head>
    <title>Apache Felix - Welcome to Apache Felix</title>
    <link rel="icon" href="/res/favicon.ico">
    <link rel="stylesheet" href="/res/site.css" type="text/css" media="all">
    <link rel="stylesheet" href="/res/codehilite.css" type="text/css" media="all">
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  </head>
  <body>
    <div class="title">
      <div class="logo">
        <a href="https://felix.apache.org/">
          <img border="0" alt="Apache Felix" src="/res/logo.png">
        </a>
      </div>
      <div class="header">
        <a href="https://www.apache.org/">
          <img border="0" alt="Apache" src="/res/apache.png">
        </a>
      </div>
    </div>
    
    <div class="menu"> 
      <style type="text/css">
/* The following code is added by mdx_elementid.py
   It was originally lifted from http://subversion.apache.org/style/site.css */
/*
 * Hide class="elementid-permalink", except when an enclosing heading
 * has the :hover property.
 */
.headerlink, .elementid-permalink {
  visibility: hidden;
}
h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
<p><a href="/news.html">News</a>  <br />
<a href="/license.html">License</a>  <br />
<a href="/downloads.cgi">Downloads</a>  <br />
<a href="/documentation.html">Documentation</a>  <br />
<a href="/documentation/community/project-info.html">Project Info</a>  <br />
<a href="/documentation/community/contributing.html">Contributing</a>  <br />
<a href="/sitemap.html">Site Map</a>  <br />
<a href="https://www.apache.org/">ASF</a>  <br />
<a href="https://www.apache.org/security/">Security</a>  <br />
<a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>  <br />
<a href="https://www.apache.org/foundation/thanks.html">Sponsors</a>    </p>
<iframe
    src="https://www.apache.org/ads/button.html"
    style="border-width:0; float: left"
    frameborder="0"
    scrolling="no"
    width="135"
    height="135">
</iframe>
    </div>
    
    <div class="main">
      <div class="breadcrump" style="font-size: 80%;">
        <a href="/">Home</a>
      </div>

      <h1>Welcome to Apache Felix</h1>
      <style type="text/css">
/* The following code is added by mdx_elementid.py
   It was originally lifted from http://subversion.apache.org/style/site.css */
/*
 * Hide class="elementid-permalink", except when an enclosing heading
 * has the :hover property.
 */
.headerlink, .elementid-permalink {
  visibility: hidden;
}
h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
<p>Apache Felix is a community effort to implement the <a href="http://www.osgi.org/Specifications/HomePage">OSGi Framework and Service platform</a> and other interesting OSGi-related technologies under the Apache license. The OSGi specifications originally targeted embedded devices and home services gateways, but they are ideally suited for any project interested in the principles of modularity, component-orientation, and/or service-orientation. OSGi technology combines aspects of these aforementioned principles to define a dynamic service deployment framework that is amenable to remote management.</p>
<h1 id="news">News<a class="headerlink" href="#news" title="Permanent link">&para;</a></h1>
<ul id="newsExcerpt">
</ul>

<p>Refer to the news <a href="/news.html">archive</a> for all news.</p>
<h1 id="apache-felix-subprojects">Apache Felix Subprojects<a class="headerlink" href="#apache-felix-subprojects" title="Permanent link">&para;</a></h1>
<p>The Felix project is organized into subprojects, where each subproject targets a specific OSGi specification or OSGi-related technology.</p>
<p>Please refer to the <a href="/documentation/subprojects.html">Subprojects</a> page for a complete list of subprojects. To see some projects using Felix subprojects, refer to the <a href="/documentation/community/projects-using-felix.html">Projects Using Felix</a> documentation.</p>
<script src="/res/jquery.js" type="text/javascript"></script>

<script type="text/javascript">
        $(document).ready(function() {
            $.get("/news.html", function(news) {
                var $newsExcerpt = $(news).find('li').slice(0,5);
                $('#newsExcerpt').append($newsExcerpt);
            });
        });
</script>
      <div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;">
        Rev. 1874793 by cziegeler on Wed, 4 Mar 2020 13:51:07 +0000
      </div>
      <div class="trademarkFooter"> 
        Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project
        logo are trademarks of The Apache Software Foundation. All other marks mentioned
        may be trademarks or registered trademarks of their respective owners.
      </div>
    </div>
  </body>
</html>
