karaf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Karaf > 4.6. Provisioning
Date Wed, 14 Jul 2010 13:43:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/1810/9/3/_/styles/combined.css?spaceKey=KARAF&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/KARAF/4.6.+Provisioning">4.6.
Provisioning</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~cmoulliard">charles
Moulliard</a>
    </h4>
        <br/>
                         <h4>Changes (2)</h4>
                                 
    
<div id="page-diffs">
            <table class="diff" cellpadding="0" cellspacing="0">
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >with the variable {{karaf.startlevel.bundle=60}}.
This value can be changed using the xml attribute start-level.  <br> <br></td></tr>
            <tr><td class="diff-changed-lines" ><span class="diff-changed-words">{code<span
class="diff-added-chars"style="background-color: #dfd;">:xml</span>}</span>
<br></td></tr>
            <tr><td class="diff-unchanged" >  &lt;feature name=&#39;my-project&#39;
version=&#39;1.0.0&#39;&gt; <br>    &lt;feature version=&#39;2.4.0&#39;&gt;camel-spring&lt;/feature&gt;
<br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >h3. Repository management <br>
<br></td></tr>
            <tr><td class="diff-changed-lines" >The following commands can be
used to manage the list of descriptors known by Karaf.  They use URLs pointing to features
descriptors.  These URLs can use any protocol known to the <span class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">ServiceMix
Kernel,</span> <span class="diff-added-words"style="background-color: #dfd;">Apache
Karaf,</span> the most common ones being http, file and mvn. <br></td></tr>
            <tr><td class="diff-unchanged" > <br>{code} <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
        </table>
</div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <style type='text/css'>/*<![CDATA[*/
table.ScrollbarTable  {border: none;padding: 3px;width: 100%;padding: 3px;margin: 0px;background-color:
#f0f0f0}
table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width: 16px;border: none;}
table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
table.ScrollbarTable td.ScrollbarParent {text-align: center;border: none;}
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width: 16px;border: none;}

/*]]>*/</style><div class="Scrollbar"><table class='ScrollbarTable'><tr><td
class='ScrollbarPrevIcon'><a href="/confluence/display/KARAF/4.5.+Security+framework"><img
border='0' align='middle' src='/confluence/images/icons/back_16.gif' width='16' height='16'></a></td><td
width='33%' class='ScrollbarPrevName'><a href="/confluence/display/KARAF/4.5.+Security+framework">4.5.
Security framework</a>&nbsp;</td><td width='33%' class='ScrollbarParent'><sup><a
href="/confluence/display/KARAF/4.+Understanding+Karaf"><img border='0' align='middle'
src='/confluence/images/icons/up_16.gif' width='8' height='8'></a></sup><a
href="/confluence/display/KARAF/4.+Understanding+Karaf">4. Understanding Karaf</a></td><td
width='33%' class='ScrollbarNextName'>&nbsp;<a href="/confluence/display/KARAF/4.7.+Administration">4.7.
Administration</a></td><td class='ScrollbarNextIcon'><a href="/confluence/display/KARAF/4.7.+Administration"><img
border='0' align='middle' src='/confluence/images/icons/forwd_16.gif' width='16' height='16'></a></td></tr></table></div>
<p><a name="4.6.Provisioning-top"></a></p>

<h1><a name="4.6.Provisioning-4.6.Provisioning"></a>4.6. Provisioning</h1>

<p>Karaf provides a simple, yet flexible, way to provision applications or "features".
 Such a mechanism is mainly provided by a set of commands available in the <tt>features</tt>
shell.  The provisioning system uses xml "repositories" that define a set of features.</p>

<h2><a name="4.6.Provisioning-Repositories"></a>Repositories</h2>

<p>The xml features repositories use the following Relax NG Compact syntax:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader"
style="border-bottom-width: 1px;"><b>Repository schema</b></div><div
class="codeContent panelContent">
<pre class="code-java">
element features {
  element repository { text }*
  element feature {
    attribute name { text },
    attribute version { text },
    element feature { 
      attribute version { text },
      text 
    }*,
    element config {
      attribute name { text },
      text
    }*,
    element bundle { text }*
  }*
}
</pre>
</div></div>

<p>Here is an example of such a repository:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;features&gt;</span>
    <span class="code-tag">&lt;feature name=<span class="code-quote">"spring"</span>
version=<span class="code-quote">"2.5.6.SEC01"</span>&gt;</span>
        <span class="code-tag">&lt;bundle&gt;</span>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aopalliance/1.0_1<span
class="code-tag">&lt;/bundle&gt;</span>
        <span class="code-tag">&lt;bundle&gt;</span>mvn:org.springframework/spring-core/2.5.6.SEC01<span
class="code-tag">&lt;/bundle&gt;</span>
        <span class="code-tag">&lt;bundle&gt;</span>mvn:org.springframework/spring-beans/2.5.6.SEC01<span
class="code-tag">&lt;/bundle&gt;</span>
        <span class="code-tag">&lt;bundle&gt;</span>mvn:org.springframework/spring-aop/2.5.6.SEC01<span
class="code-tag">&lt;/bundle&gt;</span>        
        <span class="code-tag">&lt;bundle&gt;</span>mvn:org.springframework/spring-context/2.5.6.SEC01<span
class="code-tag">&lt;/bundle&gt;</span>
        <span class="code-tag">&lt;bundle&gt;</span>mvn:org.springframework/spring-context-support/2.5.6.SEC01<span
class="code-tag">&lt;/bundle&gt;</span>
    <span class="code-tag">&lt;/feature&gt;</span>
<span class="code-tag">&lt;/features&gt;</span>
</pre>
</div></div>

<p>A repository includes a list of <tt>feature</tt> elements, each one representing
an application that can be installed.  The feature is identified by its <tt>name</tt>
which must be unique amongst all the repositories used and consists of a set of bundles that
need to be installed along with some optional dependencies on other features and some optional
configurations for the Configuration Admin OSGi service.</p>

<p>References to features define in other repositories are allow and can be achieved
by adding a list of repository.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;features&gt;</span>
  <span class="code-tag">&lt;repository&gt;</span>mvn:org.apache.servicemix.nmr/apache-servicemix-nmr/1.2.0/xml/features<span
class="code-tag">&lt;/repository&gt;</span>
  <span class="code-tag">&lt;repository&gt;</span>mvn:org.apache.camel.karaf/apache-camel/2.2.0/xml/features<span
class="code-tag">&lt;/repository&gt;</span>
  <span class="code-tag">&lt;repository&gt;</span>mvn:org.apache.felix.karaf/apache-felix-karaf/1.4.0/xml/features<span
class="code-tag">&lt;/repository&gt;</span>
  ...
</pre>
</div></div>

<div class='panelMacro'><table class='warningMacro'><colgroup><col width='24'><col></colgroup><tr><td
valign='top'><img src="/confluence/images/icons/emoticons/forbidden.gif" width="16"
height="16" align="absmiddle" alt="" border="0"></td><td>Be carefull when you
define them as there is a risk of 'cycling' dependencies.</td></tr></table></div>

<p>Remark : By default, all the features defined in a repository are not installed at
the launch of Apache Karaf (see section hereafter 'h2. Service configuration' for more info).</p>

<h3><a name="4.6.Provisioning-Bundles"></a>Bundles</h3>

<p>The main information provided by a feature is the set of OSGi bundles that defines
the application.  Such bundles are URLs pointing to the actual bundle jars.  For example,
one would write the following definition:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;bundle&gt;</span>http://repo1.maven.org/maven2/org/apache/servicemix/nmr/org.apache.servicemix.nmr.api/1.0.0-m2/org.apache.servicemix.nmr.api-1.0.0-m2.jar<span
class="code-tag">&lt;/bundle&gt;</span>
</pre>
</div></div>
<p>Doing this will make sure the above bundle is installed while installing the feature.</p>

<p>However, Karaf provides several URL handlers, in addition to the usual ones (file,
http, etc...). One of these is the maven URL handler, which allow reusing maven repositories
to point to the bundles. </p>

<h4><a name="4.6.Provisioning-MavenURLHandler"></a>Maven URL Handler</h4>

<p>The equivalent of the above bundle would be:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
&lt;bundle&gt;mvn:org.apache.servicemix.nmr/org.apache.servicemix.nmr.api/1.0.0-m2&lt;/bundle&gt;
</pre>
</div></div>
<p>In addition to being less verbose, the maven url handlers can also resolve snapshots
and can use a local copy of the jar if one is available in your maven local repository.</p>

<p>The <tt>org.ops4j.pax.url.mvn</tt> bundle resolves <tt>mvn</tt>
URLs. This flexible tool can be configured through the configuration service. For example,
to find the current repositories type:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
karaf@root:/&gt; config:list
...
----------------------------------------------------------------
Pid:            org.ops4j.pax.url.mvn
BundleLocation: mvn:org.ops4j.pax.url/pax-url-mvn/0.3.3
Properties:
   service.pid = org.ops4j.pax.url.mvn
   org.ops4j.pax.url.mvn.defaultRepositories = file:/opt/development/karaf/assembly/target/apache-felix-karaf-1.2.0-SNAPSHOT/system@snapshots
   org.ops4j.pax.url.mvn.repositories = http:<span class="code-comment">//repo1.maven.org/maven2,

</span>                                         http:<span class="code-comment">//people.apache.org/repo/m2-snapshot-repository@snapshots@noreleases,

</span>                                         http:<span class="code-comment">//repository.ops4j.org/maven2,

</span>                                         http:<span class="code-comment">//svn.apache.org/repos/asf/servicemix/m2-repo

</span>   below = list of repositories and even before the local repository
</pre>
</div></div>

<p>The repositories checked are controlled by these configuration properties. </p>

<p>For example, <tt>org.ops4j.pax.url.mvn.repositories</tt> is a comma separate
list of repository URLs specifying those remote repositories to be checked. So, to replace
the defaults with a new repository at <tt><a href="http://www.example.org/repo" class="external-link"
rel="nofollow">http://www.example.org/repo</a></tt> on the local machine:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
karaf@root:/&gt; config:edit org.ops4j.pax.url.mvn
karaf@root:/&gt; config:proplist                  
   service.pid = org.ops4j.pax.url.mvn
   org.ops4j.pax.url.mvn.defaultRepositories = file:/opt/development/karaf/assembly/target/apache-felix-karaf-1.2.0-SNAPSHOT/system@snapshots
   org.ops4j.pax.url.mvn.repositories = http:<span class="code-comment">//repo1.maven.org/maven2,
</span>                                        http:<span class="code-comment">//people.apache.org/repo/m2-snapshot-repository@snapshots@noreleases,
</span>                                        http:<span class="code-comment">//repository.ops4j.org/maven2,
</span>                                        http:<span class="code-comment">//svn.apache.org/repos/asf/servicemix/m2-repo
</span>   below = list of repositories and even before the local repository
karaf@root:/&gt; config:propset org.ops4j.pax.url.mvn.repositories http:<span class="code-comment">//www.example.org/repo
</span>karaf@root:/&gt; config:update
</pre>
</div></div>

<p>By default, snapshots are disable. To enable an URL for snapshots append @snapshots.
For example</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
http:<span class="code-comment">//www.example.org/repo@snapshots</span>
</pre>
</div></div>

<p>Repositories on the local are supported through <tt><a href="file:/" class="external-link"
rel="nofollow">file:/</a></tt> URLs</p>

<h4><a name="4.6.Provisioning-Bundlestartlevel"></a>Bundle start-level</h4>

<p>By default, the bundles deployed through the feature mechanism will have a start-level
equals to the value defined in the configuration file <tt>config.properties</tt><br/>
with the variable <tt>karaf.startlevel.bundle=60</tt>. This value can be changed
using the xml attribute start-level. </p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
  <span class="code-tag">&lt;feature name='my-project' version='1.0.0'&gt;</span>
    <span class="code-tag">&lt;feature version='2.4.0'&gt;</span>camel-spring<span
class="code-tag">&lt;/feature&gt;</span>
    <span class="code-tag">&lt;bundle start-level='80'&gt;</span>mvn:com.mycompany.myproject/myproject-dao<span
class="code-tag">&lt;/bundle&gt;</span>    
    <span class="code-tag">&lt;bundle start-level='85'&gt;</span>mvn:com.mycompany.myproject/myproject-service<span
class="code-tag">&lt;/bundle&gt;</span>
    <span class="code-tag">&lt;bundle start-level='85'&gt;</span>mvn:com.mycompany.myproject/myproject-camel-routing<span
class="code-tag">&lt;/bundle&gt;</span>
  <span class="code-tag">&lt;/feature&gt;</span> 
</pre>
</div></div>  

<p>The advantage to define the start-level of a bundle is that you can deploy all your
bundles including those of the project with the 'infrastructure' bundles required (e.g : camel,
activemq)<br/>
at the same time and you will have the guaranty when you use Spring Dynamic Module (to register
service through OSGI service layer), Blueprint that by example <br/>
Spring context will not be created without all the required services installed.</p>

<h3><a name="4.6.Provisioning-Dependantfeatures"></a>Dependant features</h3>

<p>Dependant features are usefull when a given feature depends on another feature to
be installed.  Such a dependency can be expressed easily in the feature definition:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;feature name=<span class="code-quote">"jbi"</span>&gt;</span>
  <span class="code-tag">&lt;feature&gt;</span>nmr<span class="code-tag">&lt;/feature&gt;</span>
  ...
<span class="code-tag">&lt;/feature&gt;</span>
</pre>
</div></div>

<p>The effect of such a dependency is to automatically install the required <tt>nmr</tt>
feature when the <tt>jbi</tt> feature will be installed.</p>

<h3><a name="4.6.Provisioning-Configurations"></a>Configurations</h3>

<p>The configuration section allows to deploy configuration for the OSGi Configuration
Admin service along a set of bundles.<br/>
Here is an example of such a configuration:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;config name=<span class="code-quote">"com.foo.bar"</span>&gt;</span>
  myProperty = myValue
<span class="code-tag">&lt;/config&gt;</span>
</pre>
</div></div>

<p>The <tt>name</tt> attribute of the <tt>configuration</tt>
element will be used as the ManagedService PID for the configuration set in the Configuration
Admin service.  When using a ManagedServiceFactory, the <tt>name</tt> attribute
is <em>servicePid</em>-<em>aliasId</em>, where <em>servicePid</em>
is the PID of the ManagedServiceFactory and <em>aliasId</em> is a label used to
uniquely identify a particular service (an alias to the factory generated service PID).</p>

<p>Deploying such a configuration has the same effect than dropping a file named <tt>com.foo.bar.cfg</tt>
into the <tt>etc</tt> folder.  </p>

<p>The content of the <tt>configuration</tt> element is set of properties
parsed using the <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html#load(java.io.InputStream)"
class="external-link" rel="nofollow">standard java property mechanism</a>.</p>

<p>Such configuration as usually used with Spring-DM or Blueprint support for the Configuration
Admin service, as in the following example, but using plain OSGi APIs will of course work
the same way:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;bean ...&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"propertyName"</span>
value=<span class="code-quote">"${myProperty}"</span> /&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span>

<span class="code-tag">&lt;osgix:cm-properties id=<span class="code-quote">"cmProps"</span>
persistent-id=<span class="code-quote">"com.foo.bar"</span>&gt;</span>
    <span class="code-tag">&lt;prop key=<span class="code-quote">"myProperty"</span>&gt;</span>myValue<span
class="code-tag">&lt;/prop&gt;</span>
<span class="code-tag">&lt;/osgix:cm-properties&gt;</span>
<span class="code-tag">&lt;ctx:property-placeholder properties-ref=<span class="code-quote">"cmProps"</span>
/&gt;</span>
</pre>
</div></div>

<p>For more informations about using the Configuration Admin service in Spring-DM, see
the <a href="http://static.springframework.org/osgi/docs/1.2.0-m2/reference/html/compendium.html#compendium:cm:props"
class="external-link" rel="nofollow">Spring-DM documentation</a>.</p>


<h2><a name="4.6.Provisioning-Commands"></a>Commands</h2>

<h3><a name="4.6.Provisioning-Repositorymanagement"></a>Repository management</h3>

<p>The following commands can be used to manage the list of descriptors known by Karaf.
 They use URLs pointing to features descriptors.  These URLs can use any protocol known to
the Apache Karaf, the most common ones being http, file and mvn.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
features:addUrl      Add a list of repository URLs to the features service
features:removeUrl   Remove a list of repository URLs from the features service
features:listUrl     Display the repository URLs currently associated with the features service.
features:refreshUrl  Reload the repositories to obtain a fresh list of features
</pre>
</div></div>

<p>Karaf maintains a persistent list of these repositories so that if you add one URL
and restart Karaf, the features will still be available.</p>

<p>The <tt>refreshUrl</tt> command is mostly used when developing features
descriptors: when changing the descriptor, it can be handy to reload it in the Kernel without
having to restart it or to remove then add again this URL.</p>

<h3><a name="4.6.Provisioning-Featuresmanagement"></a>Features management</h3>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
features:install
features:uninstall
features:list
</pre>
</div></div>

<h3><a name="4.6.Provisioning-Examples"></a>Examples</h3>

<p>1. Install features using mvn handler</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
features:addUrl mvn:org.apache.servicemix.nmr/apache-servicemix-nmr/1.0.0-m2/xml/features
features:install nmr
</pre>
</div></div>

<p>2. Use file handler to deploy features file</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
features:addUrl file:base/features/features.xml
</pre>
</div></div>

<p>Remark : The path is relative to the Apache Karaf installation directory</p>

<p>3. Deploy bundles from file system without using maven</p>

<p>As we can use <a href="file://" class="external-link" rel="nofollow">file://</a>
as protocol handler to deploy bundles, you can use the following syntax to deploy bundles
when they are <br/>
located in a directory which is not available using maven</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;features&gt;</span>
   <span class="code-tag">&lt;feature name=<span class="code-quote">"spring-web"</span>
version=<span class="code-quote">"2.5.6.SEC01"</span>&gt;</span>
      <span class="code-tag">&lt;bundle&gt;</span>file:base/bundles/spring-web-2.5.6.SEC01.jar<span
class="code-tag">&lt;/bundle&gt;</span>
   <span class="code-tag">&lt;/feature&gt;</span>
<span class="code-tag">&lt;/features&gt;</span>
</pre>
</div></div>

<p>Remark : The path is relative to the Apache Karaf installation directory  </p>

<h2><a name="4.6.Provisioning-Serviceconfiguration"></a>Service configuration</h2>

<p>A simple configuration file located in <tt>[FELIX:karaf]/etc/org.apache.karaf.features.cfg</tt>
can be modified to customize the behavior when starting the Kernel for the first time.<br/>
This configuration file contains two properties:</p>
<ul>
	<li><tt>featuresBoot</tt>: a comma separated list of features to install
at startup</li>
	<li><tt>featuresRepositories</tt>: a comma separated list of feature repositories
to load at startup</li>
</ul>


<p>This configuration file is of interest if you plan to distribute Apache Karaf distribution
which includes pre-installed features.  Such a process is detailed in the <a href="/confluence/display/KARAF/6.2.+Building+custom+distributions"
title="6.2. Building custom distributions">6.2. Building custom distributions</a>
section.</p>

<p><a href="#4.6.Provisioning-top">top</a></p>
<style type='text/css'>/*<![CDATA[*/
table.ScrollbarTable  {border: none;padding: 3px;width: 100%;padding: 3px;margin: 0px;background-color:
#f0f0f0}
table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width: 16px;border: none;}
table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
table.ScrollbarTable td.ScrollbarParent {text-align: center;border: none;}
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width: 16px;border: none;}

/*]]>*/</style><div class="Scrollbar"><table class='ScrollbarTable'><tr><td
class='ScrollbarPrevIcon'><a href="/confluence/display/KARAF/4.5.+Security+framework"><img
border='0' align='middle' src='/confluence/images/icons/back_16.gif' width='16' height='16'></a></td><td
width='33%' class='ScrollbarPrevName'><a href="/confluence/display/KARAF/4.5.+Security+framework">4.5.
Security framework</a>&nbsp;</td><td width='33%' class='ScrollbarParent'><sup><a
href="/confluence/display/KARAF/4.+Understanding+Karaf"><img border='0' align='middle'
src='/confluence/images/icons/up_16.gif' width='8' height='8'></a></sup><a
href="/confluence/display/KARAF/4.+Understanding+Karaf">4. Understanding Karaf</a></td><td
width='33%' class='ScrollbarNextName'>&nbsp;<a href="/confluence/display/KARAF/4.7.+Administration">4.7.
Administration</a></td><td class='ScrollbarNextIcon'><a href="/confluence/display/KARAF/4.7.+Administration"><img
border='0' align='middle' src='/confluence/images/icons/forwd_16.gif' width='16' height='16'></a></td></tr></table></div>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;">
            <a href="https://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
        </div>
        <a href="https://cwiki.apache.org/confluence/display/KARAF/4.6.+Provisioning">View
Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=87472&revisedVersion=20&originalVersion=19">View
Changes</a>
                |
        <a href="https://cwiki.apache.org/confluence/display/KARAF/4.6.+Provisioning?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message