| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ======================================================================== |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| |
| [[framework-jetty-osgi]] |
| === OSGI |
| |
| ==== Introduction |
| |
| The Jetty OSGi infrastructure provides a Jetty container inside an OSGi |
| container. Traditional JavaEE webapps can be deployed, in addition to |
| Jetty ContextHandlers, along with OSGi web bundles. In addition, the |
| infrastructure also supports the OSGi HttpService interface. |
| |
| ==== General Setup |
| |
| All of the Jetty jars contain manifest entries appropriate to ensure |
| that they can be deployed into an OSGi container as bundles. You will |
| need to install some jetty jars into your OSGi container. You can always |
| find the jetty jars either in the maven central repository, or you can |
| download a distribution of jetty. Here's the absolute minimal set of |
| jetty jars: |
| |
| .Bundle Name Mapping |
| [cols=",",options="header",] |
| |=================================================== |
| |Jar |Bundle Symbolic Name |
| |jetty-util |org.eclipse.jetty.util |
| |jetty-http |org.eclipse.jetty.http |
| |jetty-io |org.eclipse.jetty.io |
| |jetty-security |org.eclipse.jetty.security |
| |jetty-server |org.eclipse.jetty.server |
| |jetty-servlet |org.eclipse.jetty.servlet |
| |jetty-webapp |org.eclipse.jetty.webapp |
| |jetty-deploy |org.eclipse.jetty.deploy |
| |jetty-xml |org.eclipse.jetty.xml |
| |jetty-osgi-servlet-api |org.eclipse.jetty.toolchain |
| |=================================================== |
| |
| ____ |
| [NOTE] |
| |
| We recommend that you also deploy the |
| link:#osgi-annotations[annotation-related] jars also, as increasingly |
| the Servlet Specification relies on annotations for functionality. |
| ____ |
| |
| You will also need the**OSGi Event Management service** and the **OSGi |
| Configuration Management service**. If your OSGi container does not |
| automatically make these available, you will need to add them in a way |
| appropriate to your container. |
| |
| ==== The Jetty OSGi Container |
| |
| ===== The jetty-osgi-boot jar |
| |
| Now that you have the basic set of Jetty jars installed, you can install |
| the |
| http://central.maven.org/maven2/org/eclipse/jetty/osgi/jetty-osgi-boot/[jetty-osgi-boot.jar] |
| bundle, downloadable from the maven central repo |
| http://central.maven.org/maven2/org/eclipse/jetty/osgi/jetty-osgi-boot/[here.] |
| |
| This bundle will instantiate and make available the Jetty OSGi container |
| when it is started. If this bundle is not auto-started upon installation |
| into your OSGi container, you should start it manually using a command |
| appropriate for your container. |
| |
| [[customize-jetty-container]] |
| ===== Customizing the Jetty Container |
| |
| Before going ahead with the install, you may want to customize the Jetty |
| container. In general this is done by a combination of System properties |
| and the usual jetty xml configuration files. The way you define the |
| System properties will depend on which OSGi container you are using, so |
| ensure that you are familiar with how to set them for your environment. |
| In the following examples, we will assume that the OSGi container allows |
| us to set System properties as simple name=value pairs. |
| |
| The available System properties are: |
| |
| jetty.http.port:: |
| If not specified, this defaults to the usual jetty port of 8080. |
| jetty.home:: |
| Either this property _or_ the *jetty.home.bundle* _must_ be specified. |
| This property should point to a file system location that has an |
| `etc/` directory containing xml files to configure the Jetty container |
| on startup. For example: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| jetty.home=/opt/custom/jetty |
| |
| ---- |
| + |
| Where `/opt/custom/jetty` contains: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| etc/jetty.xml |
| etc/jetty-selector.xml |
| etc/jetty-deployer.xml |
| etc/jetty-special.xml |
| |
| |
| ---- |
| jetty.home.bundle:: |
| Either this property _or_ the *jetty.home* property must be specified. |
| This property should specify the symbolic name of a bundle which |
| contains a directory called `jettyhome/`. The` |
| jettyhome/` directory should have a subdirectory called |
| `etc/` that contains the xml files to be applied to Jetty on startup. |
| The jetty-osgi-boot.jar contains a` |
| jettyhome/` directory with a default set of xml |
| configuration files. Here's how you would specify it: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| jetty.home.bundle=org.eclipse.jetty.osgi.boot |
| ---- |
| + |
| Here's a partial listing of that jar that shows you the names of the |
| xml files contained within it: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| META-INF/MANIFEST.MF |
| jettyhome/etc/jetty.xml |
| jettyhome/etc/jetty-deployer.xml |
| jettyhome/etc/jetty-http.xml |
| ---- |
| jetty.etc.config.urls:: |
| This specifies the paths of the xml files that are to be used. If not |
| specified, they default to: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| etc/jetty.xml,etc/jetty-http.xml,etc/jetty-deployer.xml |
| ---- |
| + |
| Note that the paths can either be relative or absolute, or a mixture. |
| If the path is relative, it is resolved against either *jetty.home* or |
| **jetty.home.bundle**, whichever was specified. You can use this |
| ability to mix and match jetty configuration files to add |
| functionality, such as adding in a https connector. Here's an example |
| of adding a https connector, using the relevant files from the |
| jetty-distribution: |
| + |
| .... |
| etc/jetty.xml, etc/jetty-http.xml, /opt/jetty/etc/jetty-ssl.xml, /opt/jetty/etc/jetty-https.xml, etc/jetty-deployer.xml |
| .... |
| + |
| Note that regardless of whether you set the *jetty.home* or |
| *jetty.home.bundle* property, when Jetty executes the configuration |
| files, it will set an appropriate value for *jetty.home* so that |
| references in xml files to <property name="jetty.home"> will work. Be |
| careful, however, if you are mixing and matching relative and absolute |
| configuration file paths: the value of *jetty.home* is determined from |
| the resolved location of the _relative_ files only. |
| |
| ===== The Jetty Container as an OSGi Service |
| |
| You can now go ahead and deploy the jetty-osgi-boot.jar into your OSGi |
| container. A Jetty Server instance will be created, the xml config files |
| applied to it, and then published as an OSGi service. Normally, you will |
| not need to interact with this service instance, however you can |
| retrieve a reference to it using the usual OSGi API: |
| |
| [source, java, subs="{sub-order}"] |
| ---- |
| |
| org.osgi.framework.BundleContext bc; |
| org.osgi.framework.ServiceReference ref = bc.getServiceReference("org.eclipse.jetty.server.Server"); |
| |
| |
| ---- |
| |
| The Server service has a couple of properties associated with it that |
| you can retrieve using the |
| org.osgi.framework.ServiceReference.getProperty(String) method: |
| |
| managedServerName:: |
| The Jetty Server instance created by the jetty-osgi-boot.jar will be |
| called "defaultJettyServer" |
| jetty.etc.config.urls:: |
| The list of xml files resolved from either *jetty.home* |
| or**jetty.home.bundle**/jettyhome |
| |
| ===== Adding More Jetty Servers |
| |
| As we have seen in the previous section, the jetty-osgi-boot code will |
| create an org.eclipse.jetty.server.Server instance, apply the xml |
| configuration files specified by *jetty.etc.config.urls* System property |
| to it, and then register it as an OSGi Service. The name associated with |
| this default instance is "defaultJettyServer". |
| |
| You can create other Server instances, register them as OSGi Services, |
| and the jetty-osgi-boot code will notice them, and configure them so |
| that they can deploy ContextHandlers and webapp bundles. When you deploy |
| webapps or ContextHandlers as bundles or Services (see sections below) |
| you can target them to be deployed to a particular server instance via |
| the Server's name. |
| |
| Here's an example of how to create a new Server instance and register it |
| with OSGi so that the jetty-osgi-boot code will find it and configure it |
| so it can be a deployment target: |
| |
| [source, java, subs="{sub-order}"] |
| ---- |
| public class Activator implements BundleActivator |
| { |
| |
| public void start(BundleContext context) throws Exception |
| { |
| |
| Server server = new Server(); |
| //do any setup on Server in here |
| String serverName = "fooServer"; |
| Dictionary serverProps = new Hashtable(); |
| //define the unique name of the server instance |
| serverProps.put("managedServerName", serverName); |
| serverProps.put("jetty.http.port", "9999"); |
| //let Jetty apply some configuration files to the Server instance |
| serverProps.put("jetty.etc.config.urls", "file:/opt/jetty/etc/jetty.xml,file:/opt/jetty/etc/jetty-selector.xml,file:/opt/jetty/etc/jetty-deployer.xml"); |
| //register as an OSGi Service for Jetty to find |
| context.registerService(Server.class.getName(), server, serverProps); |
| |
| } |
| } |
| ---- |
| |
| Now that we have created a new Server called "fooServer", we can deploy |
| webapps and ContextHandlers as Bundles or Services to it (see below for |
| more information on this). Here's an example of deploying a webapp as a |
| Service and targetting it to the "fooServer" Server we created above: |
| |
| [source, java, subs="{sub-order}"] |
| ---- |
| public class Activator implements BundleActivator |
| { |
| |
| public void start(BundleContext context) throws Exception |
| { |
| |
| //Create a webapp context as a Service and target it at the "fooServer" Server instance |
| WebAppContext webapp = new WebAppContext(); |
| Dictionary props = new Hashtable(); |
| props.put("war","."); |
| props.put("contextPath","/acme"); |
| props.put("managedServerName", "fooServer"); |
| context.registerService(ContextHandler.class.getName(),webapp,props); |
| } |
| } |
| ---- |
| |
| ==== Deploying Bundles as Webapps |
| |
| The Jetty OSGi container listens for the installation of bundles, and |
| will automatically attempt to deploy any that appear to be webapps. |
| |
| Any of the following criteria are sufficient for Jetty to deploy the |
| bundle as a webapp: |
| |
| Bundle contains a WEB-INF/web.xml file:: |
| If the bundle contains a web descriptor, then it is automatically |
| deployed. This is an easy way to deploy classic JavaEE webapps. |
| Bundle MANIFEST contains Jetty-WarFolderPath (for releases prior to |
| jetty-9.3) or Jetty-WarResourcePath:: |
| This is the location within the bundle of the webapp resources. |
| Typically this would be used if the bundle is not a pure webapp, but |
| rather the webapp is a component of the bundle. Here's an example of a |
| bundle where the resources of the webapp are not located at the root |
| of the bundle, but rather inside the subdirectory `web/` : |
| + |
| `MANIFEST`: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| Bundle-Name: Web |
| Jetty-WarResourcePath: web |
| Import-Package: javax.servlet;version="3.1", |
| javax.servlet.resources;version="3.1" |
| Bundle-SymbolicName: com.acme.sample.web |
| |
| |
| ---- |
| + |
| Bundle contents: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| META-INF/MANIFEST.MF |
| web/index.html |
| web/foo.html |
| web/WEB-INF/web.xml |
| com/acme/sample/web/MyStuff.class |
| com/acme/sample/web/MyOtherStuff.class |
| |
| |
| ---- |
| Bundle MANIFEST contains Web-ContextPath:: |
| This header can be used in conjunction with either of the two |
| preceding headers to control the context path to which the webapp is |
| deployed, or alone to identify that the bundle's contents should be |
| published as a webapp. This header is part of the RFC-66 specification |
| for using webapps with OSGi. Here's an eample based on the previous |
| one where we use the Web-ContextPath header to set its deployment |
| context path to be "/sample" : |
| + |
| `MANIFEST`: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| Bundle-Name: Web |
| Jetty-WarResourcePath: web |
| Web-ContextPath: /sample |
| Import-Package: javax.servlet;version="3.1", |
| javax.servlet.resources;version="3.1" |
| Bundle-SymbolicName: com.acme.sample.web |
| |
| |
| ---- |
| |
| You can also define extra headers in your bundle MANIFEST that help |
| customize the web app to be deployed: |
| |
| Jetty-defaultWebXmlFilePath:: |
| The location of a webdefault.xml file to apply to the webapp. The |
| location can be either absolute (either absolute path or file: url), |
| or relative (in which case it is interpreted as relative to the bundle |
| root). Defaults to the webdefault.xml file built into the Jetty OSGi |
| container. |
| Jetty-WebXmlFilePath:: |
| The location of the web.xml file. The location can be either absolute |
| (either absolute path or file: url), or relative (in which case it is |
| interpreted as relative to the bundle root). Defaults to |
| WEB-INF/web.xml |
| Jetty-extraClassPath:: |
| A classpath of additional items to add to the webapp's classloader. |
| Jetty-bundleInstall:: |
| The path to the base folder that overrides the computed bundle |
| installation - mostly useful for those OSGi frameworks that unpack |
| bundles by default. |
| Require-TldBundle:: |
| A comma separated list of bundle symbolic names of bundles containing |
| TLDs that this webapp depends upon. |
| managedServerName:: |
| The name of the Server instance to which to deploy this webapp bundle. |
| If not specified, defaults to the default Server instance called |
| "defaultJettyServer". |
| Jetty-WarFragmentResourcePath:: |
| The path within a fragment hosted by the web-bundle that contains |
| static resources for the webapp. The path is appended to the base |
| resource for the webapp (see Jetty-WarResourcePath). |
| Jetty-WarPrependFragmentResourcePath:: |
| The path within a fragment hosted by the web-bundle that contains |
| static resources for the webapp.The path is prepended to the base |
| resource for the webapp (see Jetty-WarResourcePath). |
| Jetty-ContextFilePath:: |
| A comma separated list of paths within the webapp bundle to Jetty |
| context files that will be applied to the webapp. Alternatively you |
| may include a single Jetty context file called |
| "jetty-webapp-context.xml" in the webapp bundle's META-INF directory |
| and it will be automatically applied to the webapp. |
| |
| ===== Determining the Context Path for a Webapp Bundle |
| |
| As we have seen in the previous section, if the bundle `MANIFEST` |
| contains the RFC-66 header **Web-ContextPath**, Jetty will use that as |
| the context path. If the MANIFEST does not contain that header, then |
| Jetty will concoct a context path based on the last element of the |
| bundle's location (by calling Bundle.getLocation()) after stripping off |
| any file extensions. |
| |
| For example, suppose we have a bundle whose location is: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| file://some/where/over/the/rainbow/oz.war |
| ---- |
| |
| The corresponding synthesized context path would be: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| /oz |
| ---- |
| |
| ===== Extra Properties Available for Webapp Bundles |
| |
| You can further customize your webapp by including a jetty context xml |
| file that is applied to the webapp. This xml file must be placed in |
| `META-INF` of the bundle, and must be called `jetty-webapp-context.xml`. |
| |
| Here's an example of a webapp bundle listing containing such a file: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| META-INF/MANIFEST.MF |
| META-INF/jetty-webapp-context.xml |
| web/index.html |
| web/foo.html |
| web/WEB-INF/web.xml |
| com/acme/sample/web/MyStuff.class |
| com/acme/sample/web/MyOtherStuff.class |
| |
| |
| ---- |
| |
| Here's an example of the contents of a META-INF/jetty-webapp-context.xml |
| file: |
| |
| .... |
| <?xml version="1.0" encoding="UTF-8"?> |
| |
| <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> |
| |
| <Configure class="org.eclipse.jetty.webapp.WebAppContext"> |
| <Set name="defaultsDescriptor"><Property name="bundle.root"/>META-INF/webdefault.xml</Set> |
| </Configure> |
| .... |
| |
| As you can see, it is a normal context xml file used to set up a webapp. |
| There are, however, some additional useful properties that can be |
| referenced |
| |
| Server:: |
| This is a reference to the Jetty org.eclipse.jetty.server.Server |
| instance to which the webapp being configured in the context xml file |
| will be deployed. |
| bundle.root:: |
| This is a reference to the org.eclipse.jetty.util.resource.Resource |
| that represents the location of the Bundle. Note that this could be |
| either a directory in the file system if the OSGi container |
| automatically unpacks bundles, or it may be a jar:file: url if the |
| bundle remains packed. |
| |
| ==== Deploying Bundles as Jetty ContextHandlers |
| |
| In addition to deploying webapps, the Jetty OSGi container listens for |
| the installation of bundles that are not heavyweight webapps, but rather |
| use the flexible Jetty-specific concept of ContextHandlers. |
| |
| The following is the criteria used to decide if a bundle can be deployed |
| as a ContextHandler: |
| |
| Bundle MANIFEST contains Jetty-ContextFilePath:: |
| A comma separated list of names of context files - each one of which |
| represents a ContextHandler that should be deployed by Jetty. The |
| context files can be inside the bundle, external to the bundle |
| somewhere on the file system, or external to the bundle in the |
| *jetty.home* directory. |
| + |
| A context file that is inside the bundle: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| Jetty-ContextFilePath: ./a/b/c/d/foo.xml |
| ---- |
| + |
| A context file that is on the file system: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| Jetty-ContextFilePath: /opt/app/contexts/foo.xml |
| ---- |
| + |
| A context file that is relative to jetty.home: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| Jetty-ContextFilePath: contexts/foo.xml |
| ---- |
| + |
| A number of different context files: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| Jetty-ContextFilePath: ./a/b/c/d/foo.xml,/opt/app/contexts/foo.xml,contexts/foo.xml |
| ---- |
| |
| Other MANIFEST properties that can be used to configure the deployment |
| of the ContextHandler: |
| |
| managedServerName:: |
| The name of the Server instance to which to deploy this webapp bundle. |
| If not specified, defaults to the default Server instance called |
| "defaultJettyServer". |
| |
| ===== Determining the Context Path for a ContextHandler Bundle |
| |
| Usually, the context path for the ContextHandler will be set by the |
| context xml file. However, you can override any path set in the context |
| xml file by using the *Web-ContextPath* header in the `MANIFEST`. |
| |
| ===== Extra Properties Available for Context Xml Files |
| |
| Before the Jetty OSGi container applies a context xml file found in a |
| Jetty-ContextFilePath MANIFEST header, it sets a few useful properties |
| that can be referred to within the xml file: |
| |
| Server:: |
| This is a reference to the Jetty org.eclipse.jetty.server.Server |
| instance to which the ContextHandler being configured in the context |
| xml file will be deployed. |
| bundle.root:: |
| This is a reference to the org.eclipse.jetty.util.resource.Resource |
| that represents the location of the Bundle (obtained by calling |
| Bundle.getLocation()). Note that this could be either a directory in |
| the file system if the OSGi container automatically unpacks bundles, |
| or it may be a jar:file: url if the bundle remains packed. |
| |
| Here's an example of a context xml file that makes use of these |
| properties: |
| |
| [source, xml, subs="{sub-order}"] |
| ---- |
| include::{SRCDIR}/jetty-osgi/test-jetty-osgi-context/src/main/context/acme.xml[] |
| ---- |
| |
| [[services-as-webapps]] |
| ==== Deploying Services as Webapps |
| |
| In addition to listening for bundles whose format or `MANIFEST` entries |
| define a webapp or ContextHandler for to be deployed, the Jetty OSGi |
| container also listens for the registration of OSGi services that are |
| instances of org.eclipse.jetty.webapp.WebAppContext. So you may |
| programmatically create a WebAppContext, register it as a service, and |
| have Jetty pick it up and deploy it. |
| |
| Here's an example of doing that with a simple bundle that serves static |
| content, and an org.osgi.framework.BundleActivator that instantiates the |
| WebAppContext: |
| |
| The bundle contents: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| META-INF/MANIFEST.MF |
| index.html |
| com/acme/osgi/Activator.class |
| |
| |
| ---- |
| |
| The `MANIFEST.MF`: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| Bundle-Classpath: . |
| Bundle-Name: Jetty OSGi Test WebApp |
| DynamicImport-Package: org.eclipse.jetty.*;version="[9.0,10.0)" |
| Bundle-Activator: com.acme.osgi.Activator |
| Import-Package: org.eclipse.jetty.server.handler;version="[9.0,10)", |
| org.eclipse.jetty.webapp;version="[9.0,10)", |
| org.osgi.framework;version= "[1.5,2)", |
| org.osgi.service.cm;version="1.2.0", |
| org.osgi.service.packag eadmin;version="[1.2,2)", |
| org.osgi.service.startlevel;version="1.0.0", |
| org.osgi.service.url;version="1.0.0", |
| org.osgi.util.tracker;version= "1.3.0", |
| org.xml.sax,org.xml.sax.helpers |
| Bundle-SymbolicName: com.acme.testwebapp |
| |
| |
| ---- |
| |
| The Activator code: |
| |
| [source, java, subs="{sub-order}"] |
| ---- |
| |
| public void start(BundleContext context) throws Exception |
| { |
| WebAppContext webapp = new WebAppContext(); |
| Dictionary props = new Hashtable(); |
| props.put("Jetty-WarResourcePath","."); |
| props.put("contextPath","/acme"); |
| context.registerService(ContextHandler.class.getName(),webapp,props); |
| } |
| |
| |
| ---- |
| |
| The above setup is sufficient for Jetty to recognize and deploy the |
| WebAppContext at /acme. |
| |
| As the example shows, you can use OSGi Service properties in order to |
| communicate extra configuration information to Jetty: |
| |
| Jetty-WarFolderPath (for releases prior to 9.3) or |
| Jetty-WarResourcePath:: |
| The location within the bundle of the root of the static resources for |
| the webapp |
| Web-ContextPath:: |
| The context path at which to deploy the webapp. |
| Jetty-defaultWebXmlFilePath:: |
| The location within the bundle of a webdefault.xml file to apply to |
| the webapp. Defaults to that of the Jetty OSGi container. |
| Jetty-WebXmlFilePath:: |
| The location within the bundle of the web.xml file. Defaults to |
| WEB-INF/web.xml |
| Jetty-extraClassPath:: |
| A classpath of additional items to add to the webapp's classloader. |
| Jetty-bundleInstall:: |
| The path to the base folder that overrides the computed bundle |
| installation - mostly useful for those OSGi frameworks that unpack |
| bundles by default. |
| Require-TldBundle:: |
| A comma separated list of bundle symbolic names of bundles containing |
| TLDs that this webapp depends upon. |
| managedServerName:: |
| The name of the Server instance to which to deploy this webapp. If not |
| specified, defaults to the default Server instance called |
| "defaultJettyServer". |
| Jetty-WarFragmentResourcePath:: |
| The path within a fragment hosted by the web-bundle that contains |
| static resources for the webapp. The path is appended to the base |
| resource for the webapp (see Jetty-WarResourcePath). |
| Jetty-WarPrependFragmentResourcePath:: |
| The path within a fragment hosted by the web-bundle that contains |
| static resources for the webapp.The path is prepended to the base |
| resource for the webapp (see Jetty-WarResourcePath). |
| |
| ==== Deploying Services as ContextHandlers |
| |
| Similarly to WebAppContexts, the Jetty OSGi container can detect the |
| registration of an OSGi Service that represents a ContextHandler and |
| ensure that it is deployed. The ContextHandler can either be fully |
| configured before it is registered as an OSGi service - in which case |
| the Jetty OSGi container will merely deploy it - or the ContextHandler |
| can be partially configured, with the Jetty OSGi container completing |
| the configuration via a context xml file and properties associated with |
| the Service. |
| |
| Here's an example of doing that with a simple bundle that serves static |
| content with an org.osgi.framework.BundleActivator that instantiates a |
| ContextHandler and registers it as an OSGi Service, passing in |
| properties that define a context xml file and context path for Jetty to |
| apply upon deployment: |
| |
| The bundle contents: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| META-INF/MANIFEST.MF |
| static/index.html |
| acme.xml |
| com/acme/osgi/Activator.class |
| com/acme/osgi/Activator$1.class |
| |
| |
| ---- |
| |
| The `MANIFEST`: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| Bundle-Classpath: . |
| Bundle-Name: Jetty OSGi Test Context |
| DynamicImport-Package: org.eclipse.jetty.*;version="[9.0,10.0)" |
| Bundle-Activator: com.acme.osgi.Activator |
| Import-Package: javax.servlet;version="2.6.0", |
| javax.servlet.resources;version="2.6.0", |
| org.eclipse.jetty.server.handler;version="[9.0,10)", |
| org.osgi.framework;version="[1.5,2)", |
| org.osgi.service.cm;version="1.2.0", |
| org.osgi.service.packageadmin;version="[1.2,2)", |
| org.osgi.service.startlevel;version="1.0.0.o", |
| org.osgi.service.url;version="1.0.0", |
| org.osgi.util.tracker;version="1.3.0", |
| org.xml.sax,org.xml.sax.helpers |
| Bundle-SymbolicName: com.acme.testcontext |
| |
| |
| ---- |
| |
| The Activator code: |
| |
| [source, java, subs="{sub-order}"] |
| ---- |
| |
| public void start(final BundleContext context) throws Exception |
| { |
| ContextHandler ch = new ContextHandler(); |
| ch.addEventListener(new ServletContextListener () { |
| |
| @Override |
| public void contextInitialized(ServletContextEvent sce) |
| { |
| System.err.println("Context is initialized"); |
| } |
| |
| @Override |
| public void contextDestroyed(ServletContextEvent sce) |
| { |
| System.err.println("Context is destroyed!"); |
| } |
| |
| }); |
| Dictionary props = new Hashtable(); |
| props.put("Web-ContextPath","/acme"); |
| props.put("Jetty-ContextFilePath", "acme.xml"); |
| context.registerService(ContextHandler.class.getName(),ch,props); |
| } |
| |
| |
| ---- |
| |
| The contents of the `acme.xml` context file: |
| |
| [source, xml, subs="{sub-order}"] |
| ---- |
| include::{SRCDIR}/jetty-osgi/test-jetty-osgi-context/src/main/context/acme.xml[] |
| ---- |
| |
| You may also use the following OSGi Service properties: |
| |
| managedServerName:: |
| The name of the Server instance to which to deploy this webapp. If not |
| specified, defaults to the default Server instance called |
| "defaultJettyServer". |
| |
| ===== Extra Properties Available for Context Xml Files |
| |
| Before the Jetty OSGi container applies a context xml file found in a |
| Jetty-ContextFilePath property, it sets a few useful properties that can |
| be referred to within the xml file: |
| |
| Server:: |
| This is a reference to the Jetty org.eclipse.jetty.server.Server |
| instance to which the ContextHandler being configured in the context |
| xml file will be deployed. |
| bundle.root:: |
| This is a reference to the org.eclipse.jetty.util.resource.Resource |
| that represents the location of the Bundle publishing the |
| ContextHandler as a Service(obtained by calling Bundle.getLocation()). |
| Note that this could be either a directory in the file system if the |
| OSGi container automatically unpacks bundles, or it may be a jar:file: |
| url if the bundle remains packed. |
| |
| In the example above, you can see both of these properties being used in |
| the context xml file. |
| |
| ==== Support for the OSGi Service Platform Enterprise Specification |
| |
| The Jetty OSGi container implements several aspects of the Enterprise |
| Specification v4.2 for the WebAppContexts and ContextHandlers that it |
| deploys from either bundles or OSGi services as outlined in foregoing |
| sections. |
| |
| ===== Context Attributes |
| |
| For each WebAppContext or ContextHandler, the following context |
| attribute is set, as required by section__128.6.1 Bundle Context__ pg |
| 427: |
| |
| osgi-bundleContext:: |
| The value of this attribute is the BundleContext representing the |
| Bundle associated with the WebAppContext or ContextHandler. |
| |
| ===== Service Attributes |
| |
| As required by the specification section _128.3.4 Publishing the Servlet |
| Context_ pg 421, each WebAppContext and ContextHandler deployed by the |
| Jetty OSGi container is also published as an OSGi service (unless it has |
| been already - see sections 1.6 and 1.7). The following properties are |
| associated with these services: |
| |
| osgi.web.symbolicname:: |
| The symbolic name of the Bundle associated with the WebAppContext or |
| ContextHandler |
| osgi.web.version:: |
| The Bundle-Version header from the Bundle associated with the |
| WebAppContext or ContextHandler |
| osgi.web.contextpath:: |
| The context path of the WebAppContext or ContextHandler |
| |
| ===== OSGi Events |
| |
| As required by the specification section _128.5 Events_ pg 426, the |
| following OSGi Event Admin events will be posted: |
| |
| org/osgi/service/web/DEPLOYING:: |
| The Jetty OSGi container is about to deploy a WebAppContext or |
| ContextHandler |
| org/osgi/service/web/DEPLOYED:: |
| The Jetty OSGi container has finished deploying a WebAppContext or |
| ContextHandler and it is in service |
| org/osgi/service/web/UNDEPLOYING:: |
| The Jetty OSGi container is about to undeploy a WebAppContext or |
| ContextHandler |
| org/osgi/service/web/UNDEPLOYED:: |
| The Jetty OSGi container has finished undeploying a WebAppContext or |
| ContextHandler and it is no longer in service |
| org/osgi/service/web/FAILED:: |
| The Jetty OSGi container failed to deploy a WebAppContext or |
| ContextHandler |
| |
| ==== Using JSPs |
| |
| ===== Setup |
| |
| In order to use JSPs with your webapps and bundles you will need to |
| install the JSP and JSTL jars and their dependencies into your OSGi |
| container. Some you will find in the Jetty distribution, whereas others |
| you will need to download from |
| http://central.maven.org/maven2/org/eclipse/jetty/orbit/[Maven central]. |
| Here is the list of recommended jars (NOTE the version numbers may |
| change in future): |
| |
| .Jars Required for JSP |
| [cols=",,",options="header",] |
| |======================================================================= |
| |Jar |Bundle Symbolic Name |Location |
| |The link:#osgi-annotations[annotation jars] | | |
| |
| |org.mortbay.jasper:apache-el |org.mortbay.jasper.apache-el |
| |Distribution lib/apache-jsp |
| |
| |org.mortbay.jasper:apache-jsp |org.mortbay.jasper.apache-jsp |
| |Distribution lib/apache-jsp |
| |
| |org.eclipse.jetty:apache-jsp |org.eclipse.jetty.apache-jsp |
| |Distribution lib/apache-jsp |
| |
| |org.eclipse.jdt.core-3.8.2.v20130121.jar |
| |org.eclipse.jdt.core.compiler.batch |Distribution lib/apache-jsp |
| |
| |org.eclipse.jetty.osgi:jetty-osgi-boot-jsp |
| |org.eclipse.jetty.osgi.boot.jsp |
| |http://central.maven.org/maven2/org/eclipse/jetty/osgi/jetty-osgi-boot-jsp[Maven |
| central] |
| |======================================================================= |
| |
| ____ |
| [NOTE] |
| 1. As of jetty-9.2.3 the jetty-osgi-boot-jsp bundle changed to using |
| Apache Jasper as the JSP implementation. Prior to this the Glassfish |
| Jasper implementation was used, which had a different set of |
| dependencies - pay careful attention to the jars listed both at the top |
| of this page and in this section, as deployment of other jars can cause |
| incomplete or incorrect package resolution in the OSGi container. |
| 2. The order of deployment is important. Deploy these bundles in the |
| order shown or you may experience strange failures in the compilation of |
| jsps. This can be hard to diagnose but is almost always caused by the |
| ServletContainerInitializer in the org.eclipse.jetty.apache-jsp bundle |
| for the jsp container not being invoked due to incorrect startup of the |
| annotation jars. |
| ____ |
| |
| For the JSTL library, we recommend the use of the implementation from |
| Glassfish, as it has fewer dependencies: |
| |
| .Jars Required for Glassfish JSTL |
| [cols=",,",options="header",] |
| |======================================================================= |
| |Jar |Bundle Symbolic Name |Location |
| |The jsp jars | | |
| |
| |org.eclipse.jetty.orbit:javax.servlet.jsp.jstl-1.2.0.v201105211821.jar |
| |javax.servlet.jsp.jstl |Distribution lib/jsp |
| |
| |org.glassfish.web:javax.servlet.jsp.jstl-1.2.2.jar |
| |org.glassfish.web.javax.servlet.jsp.jstl |Distribution lib/jsp |
| |======================================================================= |
| |
| However, if you wish, you may use the JSTL implementation from Apache |
| instead, although you will need to source some dependency jars with |
| suitable OSGi manifests: |
| |
| .Jars Required for Apache JSTL |
| [cols=",,",options="header",] |
| |======================================================================= |
| |Jar |Bundle Symbolic Name |Location |
| |The jsp jars | | |
| |
| |org.apache.taglibs:taglibs-standard-spec:jar:1.2.1 |
| |org.apache.taglibs.taglibs-standard-spec |Distribution lib/apache-jstl |
| |
| |org.apache.taglibs:taglibs-standard-spec:jar:1.2.1 |
| |org.apache.taglibs.standard-impl |Distribution lib/apache-jstl |
| |
| |org.apache.xalan 2.7.1 | |Try |
| http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/plugins/org.apache.xalan_2.7.1.v201005080400.jar[Eclipse |
| Orbit] |
| |
| |org.apache.xml.serializer 2.7.1 | |Try |
| http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/plugins/org.apache.xml.serializer_2.7.1.v201005080400.jar[Eclipse |
| Orbit] |
| |======================================================================= |
| |
| ===== The jetty-osgi-boot-jsp jar |
| |
| To be able to use JSPs you will need to also install the |
| http://central.maven.org/maven2/org/eclipse/jetty/osgi/jetty-osgi-boot-jsp/[jetty-osgi-boot-jsp.jar] |
| into your OSGi container. This jar can be obtained from maven central |
| http://central.maven.org/maven2/org/eclipse/jetty/osgi/jetty-osgi-boot-jsp/[here]. |
| |
| This bundle acts as a fragment extension to the jetty-osgi-boot.jar and |
| adds in support for using JSP. |
| |
| ====== Using TagLibs |
| |
| The Jetty JSP OSGi container will make available the JSTL tag library to |
| all webapps. If you only use this tag library, then your webapp will |
| work without any further modification. |
| |
| However, if you make use of other taglibs, you will need to ensure that |
| they are installed into the OSGi container, and also define some System |
| properties and/or MANIFEST headers in your webapp. This is necessary |
| because the classloading regime used by the OSGi container is very |
| different than that used by JSP containers, and the MANIFEST of a normal |
| webapp does not contain enough information for the OSGi environment to |
| allow a JSP container to find and resolve TLDs referenced in the |
| webapp's .jsp files. |
| |
| Firstly, lets look at an example of a web bundle's modified MANIFEST |
| file so you get an idea of what is required. This example is a web |
| bundle that uses the Spring servlet framework: |
| |
| [source, plain, subs="{sub-order}"] |
| ---- |
| |
| Bundle-SymbolicName: com.acme.sample |
| Bundle-Name: WebSample |
| Web-ContextPath: taglibs |
| Import-Bundle: org.springframework.web.servlet |
| Require-TldBundle: org.springframework.web.servlet |
| Bundle-Version: 1.0.0 |
| Import-Package: org.eclipse.virgo.web.dm;version="[3.0.0,4.0.0)",org.s |
| pringframework.context.config;version="[2.5.6,4.0.0)",org.springframe |
| work.stereotype;version="[2.5.6,4.0.0)",org.springframework.web.bind. |
| annotation;version="[2.5.6,4.0.0)",org.springframework.web.context;ve |
| rsion="[2.5.6,4.0.0)",org.springframework.web.servlet;version="[2.5.6 |
| ,4.0.0)",org.springframework.web.servlet.view;version="[2.5.6,4.0.0)" |
| |
| |
| ---- |
| |
| The *Require-TldBundle* header tells the Jetty OSGi container that this |
| bundle contains TLDs that need to be passed over to the JSP container |
| for processing. The *Import-Bundle* header ensures that the |
| implementation classes for these TLDs will be available to the webapp on |
| the OSGi classpath. |
| |
| The format of the *Require-TldBundle* header is a comma separated list |
| of one or more symbolic names of bundles containing TLDs. |
| |
| ====== Container Path Taglibs |
| |
| Some TLD jars are required to be found on the Jetty OSGi container's |
| classpath, rather than considered part of the web bundle's classpath. |
| For example, this is true of JSTL and Java Server Faces. The Jetty OSGi |
| container takes care of JSTL for you, but you can control which other |
| jars are considered as part of the container's classpath by using the |
| System property **org.eclipse.jetty.osgi.tldbundles**: |
| |
| org.eclipse.jetty.osgi.tldbundles:: |
| System property defined on the OSGi environment that is a comma |
| separated list of symbolic names of bundles containing taglibs that |
| will be treated as if they are on the container's classpath for web |
| bundles. For example: |
| + |
| [source, plain, subs="{sub-order}"] |
| ---- |
| org.eclipse.jetty.osgi.tldbundles=com.acme.special.tags,com.foo.web,org.bar.web.framework |
| ---- |
| + |
| You will still need to define the *Import-Bundle* header in the |
| MANIFEST file for the web bundle to ensure that the TLD bundles are on |
| the OSGi classpath. |
| |
| Alternatively or additionally, you can define a pattern as a context |
| attribute that will match symbolic bundle names in the OSGi environment |
| containing TLDs that should be considered as discovered from the |
| container's classpath. |
| |
| org.eclipse.jetty.server.webapp.containerIncludeBundlePattern:: |
| This pattern must be specified as a context attribute of the |
| WebAppContext representing the web bundle. Unless you are deploying |
| your own WebAppContext (see link:#services-as-webapps[Deploying |
| Services as Webapps]), you won't have a reference to the WebAppContext |
| to do this. In that case, it can be specified on the |
| org.eclipse.jetty.deploy.DeploymentManager, where it will be applied |
| to _every_ webapp deployed by the Jetty OSGi container. The |
| jetty-osgi-boot.jar contains the default |
| jettyhome/etc/jetty-deploy.xml file where the DeploymentManager is |
| defined. To set the pattern, you will need to provide your own etc |
| files - see the section on link:#customize-jetty-container[customizing |
| the jetty container] for how to do this. Here's how the |
| jetty-deploy.xml file would look if we defined a pattern that matched |
| all bundle symbolic names ending in "tag" and "web": |
| + |
| [source, xml, subs="{sub-order}"] |
| ---- |
| |
| <?xml version="1.0"?> |
| <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> |
| <Configure id="Server" class="org.eclipse.jetty.server.Server"> |
| <Call name="addBean"> |
| <Arg> |
| <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager"> |
| <Set name="contexts"> |
| <Ref refid="Contexts" /> |
| </Set> |
| <Call name="setContextAttribute"> |
| <Arg>org.eclipse.jetty.server.webapp.ContainerIncludeBundlePattern</Arg> |
| <Arg>.*\.tag$|.*\.web$</Arg> |
| </Call> |
| </New> |
| </Arg> |
| </Call> |
| </Configure> |
| |
| |
| ---- |
| + |
| Again, you will still need to define suitable *Import-Bundle* headers |
| in your web bundle MANIFEST to ensure that bundles matching the |
| pattern are available on the OSGi class path. |
| |
| [[osgi-annotations]] |
| ==== Using Annotations/ServletContainerInitializers |
| |
| Annotations are very much part of the Servlet 3.0 and 3.1 |
| specifications. In order to use them with Jetty in OSGi, you will need |
| to deploy some extra jars into your OSGi container: |
| |
| .Jars Required for Annotations |
| [cols=",,",options="header",] |
| |======================================================================= |
| |Jar |Bundle Symbolic Name |Location |
| |org.ow2.asm:asm-5.0.1.jar |org.objectweb.asm |
| |http://central.maven.org/maven2/org/ow2/asm/asm[Maven central] |
| |
| |org.ow2.asm:asm-commons-5.0.1.jar |org.objectweb.asm.commons |
| |http://central.maven.org/maven2/org/ow2/asm/asm-commons[Maven central] |
| |
| |org.ow2.asm:asm-tree-5.0.1.jar |org.objectweb.asm.tree |
| |http://central.maven.org/maven2/org/ow2/asm/asm-tree[Maven central] |
| |
| |org.apache.aries:org.apache.aries.util-1.0.1.jar |org.apache.aries.util |
| |http://central.maven.org/maven2/org/apache/aries/org.apache.aries.util/[Maven |
| central] |
| |
| |org.apache.aries.spifly:org.apache.aries.spifly.dynamic.bundle-1.0.1.jar |
| |org.apache.aries.spifly.dynamic.bundle |
| |http://central.maven.org/maven2/org/apache/aries/spifly/org.apache.aries.spifly.dynamic.bundle/[Maven |
| central] |
| |
| |javax.annotation:javax.annotation-api-1.2.jar |javax.annotation-api |
| |http://central.maven.org/maven2/javax/annotation/javax.annotation-api/[Maven |
| central] |
| |
| |jta api version 1.1.1 (eg |
| org.apache.geronimo.specs:geronimo-jta_1.1_spec-1.1.1.jar)^*^ | |Maven |
| central |
| |
| |javax mail api version 1.4.1 (eg |
| org.eclipse.jetty.orbit:javax.mail.glassfish-1.4.1.v201005082020.jar)^*^ |
| | |Maven central |
| |
| |jetty-jndi |org.eclipse.jetty.jndi |Distribution lib/ |
| |
| |jetty-plus |org.eclipse.jetty.plus |Distribution lib/ |
| |
| |jetty-annotations |org.eclipse.jetty.annotations |Distribution lib/ |
| |======================================================================= |
| |
| ____ |
| [IMPORTANT] |
| If you wish to use JSPs you will need to deploy these annotation-related |
| jars. |
| ____ |
| |
| ____ |
| [NOTE] |
| You may be able to deploy later versions or other providers of these |
| specifications, however these particular versions are known to have |
| correct manifests and have been tested and known to work with OSGi |
| ____ |
| |
| Even if your webapp itself does not not use annotations, you may need to |
| deploy these jars because your webapp depends on a Jetty module or a 3rd |
| party library that uses a |
| http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html[javax.servlet.ServletContainerInitializer]. |
| This interface requires annotation support. It is implemented by |
| providers of code that extend the capabilities of the container. An |
| example of this is the Jetty JSR356 Websocket implementation, although |
| it is being used increasingly commonly in popular libraries like |
| link:http://projects.spring.io/spring-framework/[Spring], link:https://jersey.java.net/[Jersey] |
| and JSP containers. |
| |
| To find ServletContainerInitializers on the classpath, Jetty uses the |
| Java |
| http://docs.oracle.com/javase/7/docs/api/java/util/ServiceLoader.html[ServiceLoader] |
| mechanism. For this to function in OSGi, you will need an OSGi R5 |
| compatible container, and have support for the |
| http://blog.osgi.org/2013/02/javautilserviceloader-in-osgi.html[Service |
| Loader Mediator]. Jetty has been tested with |
| thehttp://aries.apache.org/modules/spi-fly.html[Aries SpiFly]module, |
| which is the reference implementation of the Service Loader Mediator, |
| and is listed in the jars above. |
| |
| ==== OSGi Containers |
| |
| ===== Felix |
| |
| The Jetty OSGi integration has been successfully tested against |
| http://felix.apache.org/[Felix] 5.0.0. |
| |
| You will require the following extra Felix services, available as |
| separately downloadable jars: |
| |
| * http://felix.apache.org/documentation/subprojects/apache-felix-config-admin.html[Felix |
| Configuration Admin Service] |
| * http://felix.apache.org/documentation/subprojects/apache-felix-event-admin.html[Felix |
| Event Admin Service] |
| |
| Unfortunately, as of Felix 4.x there is a difficultly with the |
| resolution of the javax.transaction package. |
| A link:http://mail-archives.apache.org/mod_mbox/felix-users/201211.mbox/%3CCAPr=90M+5vYjPqAvyTU+gYHr64y_FosBYELeUYcU_rFEJF3Cxw@mail.gmail.com%3E[description of the problem] and hint to solving it is described [http://mail-archives.apache.org/mod_mbox/felix-users/201211.mbox/%3CCAPr=90M+5vYjPqAvyTU+gYHr64y_FosBYELeUYcU_rFEJF3Cxw@mail.gmail.com%3E[here]]. |
| |
| The simplest solution for this is to extract the `default.properties` |
| file from the `felix.jar, change the declaration of the javax.sql and |
| javax.transaction packages` and set the changed lines as the value |
| of the `org.osgi.framework.system.packages` property in the |
| `conf/config.properties` file. |
| |
| The `default.properties` file defines the default |
| `org.osgi.framework.system.packages` property like this: |
| |
| [source,properties] |
| ---- |
| # Default packages exported by system bundle. |
| org.osgi.framework.system.packages=org.osgi.framework; version=1.7.0, \ |
| org.osgi.framework.hooks.bundle; version=1.1.0, \ |
| org.osgi.framework.hooks.resolver; version=1.0.0, \ |
| org.osgi.framework.hooks.service; version=1.1.0, \ |
| org.osgi.framework.hooks.weaving; version=1.0.0, \ |
| org.osgi.framework.launch; version=1.1.0, \ |
| org.osgi.framework.namespace; version=1.0.0, \ |
| org.osgi.framework.startlevel; version=1.0.0, \ |
| org.osgi.framework.wiring; version=1.1.0, \ |
| org.osgi.resource; version=1.0.0, \ |
| org.osgi.service.packageadmin; version=1.2.0, \ |
| org.osgi.service.startlevel; version=1.1.0, \ |
| org.osgi.service.url; version=1.0.0, \ |
| org.osgi.util.tracker; version=1.5.1 \ |
| ${jre-${java.specification.version}} |
| ---- |
| |
| The last line must be substituted for one of the definitions further |
| down in the file that is suitable for the jvm you are using. |
| |
| You will take these lines and copy them into the |
| `conf/config.properties` file, after having replaced the line |
| $\{jre-$\{java.specification.version}} with all of the lines relevant to |
| your version of the jvm. |
| |
| For example, for a 1.7 jvm, you will find this property definition: |
| |
| [source,properties] |
| ---- |
| jre-1.7=, \ |
| javax.accessibility;uses:="javax.swing.text";version="0.0.0.1_007_JavaSE", \ |
| javax.activation;version="0.0.0.1_007_JavaSE", \ |
| javax.activity;version="0.0.0.1_007_JavaSE", \ |
| javax.annotation.processing;uses:="javax.tools,javax.lang.model,javax.lang.model.element,javax.lang.model.util";version="0.0.0.1_007_JavaSE", \ |
| javax.annotation;version="0.0.0.1_007_JavaSE", \ |
| javax.crypto.interfaces;uses:="javax.crypto.spec,javax.crypto";version="0.0.0.1_007_JavaSE", \ |
| javax.crypto.spec;uses:="javax.crypto";version="0.0.0.1_007_JavaSE", \ |
| javax.crypto;uses:="javax.crypto.spec";version="0.0.0.1_007_JavaSE", \ |
| javax.imageio.event;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ |
| javax.imageio.metadata;uses:="org.w3c.dom,javax.imageio";version="0.0.0.1_007_JavaSE", \ |
| javax.imageio.plugins.bmp;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ |
| javax.imageio.plugins.jpeg;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ |
| javax.imageio.spi;uses:="javax.imageio.stream,javax.imageio,javax.imageio.metadata";version="0.0.0.1_007_JavaSE", \ |
| javax.imageio.stream;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", \ |
| javax.imageio;uses:="javax.imageio.metadata,javax.imageio.stream,javax.imageio.spi,javax.imageio.event";version="0.0.0.1_007_JavaSE", \ |
| javax.jws.soap;version="0.0.0.1_007_JavaSE", \ |
| javax.jws;version="0.0.0.1_007_JavaSE", \ |
| javax.lang.model.element;uses:="javax.lang.model.type,javax.lang.model";version="0.0.0.1_007_JavaSE", \ |
| javax.lang.model.type;uses:="javax.lang.model.element,javax.lang.model";version="0.0.0.1_007_JavaSE", \ |
| javax.lang.model.util;uses:="javax.lang.model,javax.lang.model.element,javax.annotation.processing,javax.lang.model.type";version="0.0.0.1_007_JavaSE", \ |
| javax.lang.model;version="0.0.0.1_007_JavaSE", \ |
| javax.management.loading;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ |
| javax.management.modelmbean;uses:="javax.management,javax.management.loading";version="0.0.0.1_007_JavaSE", \ |
| javax.management.monitor;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ |
| javax.management.openmbean;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ |
| javax.management.relation;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ |
| javax.management.remote.rmi;uses:="javax.management.remote,javax.security.auth,javax.management,javax.management.loading,javax.naming,javax.rmi.ssl,org.omg.CORBA,org.omg.CORBA_2_3.portable,org.omg.CORBA.portable,javax.rmi.CORBA,javax.rmi";version="0.0.0.1_007_JavaSE", \ |
| javax.management.remote;uses:="javax.security.auth,javax.management";version="0.0.0.1_007_JavaSE", \ |
| javax.management.timer;uses:="javax.management";version="0.0.0.1_007_JavaSE", \ |
| javax.management;uses:="javax.management.loading,javax.management.openmbean";version="0.0.0.1_007_JavaSE", \ |
| javax.naming.directory;uses:="javax.naming";version="0.0.0.1_007_JavaSE", \ |
| javax.naming.event;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_007_JavaSE", \ |
| javax.naming.ldap;uses:="javax.naming,javax.naming.directory,javax.net.ssl,javax.naming.event";version="0.0.0.1_007_JavaSE", \ |
| javax.naming.spi;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_007_JavaSE", \ |
| javax.naming;uses:="javax.naming.spi";version="0.0.0.1_007_JavaSE", \ |
| javax.net.ssl;uses:="javax.security.cert,javax.security.auth.x500,javax.net";version="0.0.0.1_007_JavaSE", \ |
| javax.net;version="0.0.0.1_007_JavaSE", \ |
| javax.print.attribute.standard;uses:="javax.print.attribute";version="0.0.0.1_007_JavaSE", \ |
| javax.print.attribute;version="0.0.0.1_007_JavaSE", \ |
| javax.print.event;uses:="javax.print,javax.print.attribute";version="0.0.0.1_007_JavaSE", \ |
| javax.print;uses:="javax.print.attribute,javax.print.event,javax.print.attribute.standard";version="0.0.0.1_007_JavaSE", \ |
| javax.rmi.CORBA;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable,org.omg.CORBA.portable,org.omg.SendingContext";version="0.0.0.1_007_JavaSE", \ |
| javax.rmi.ssl;uses:="javax.net,javax.net.ssl";version="0.0.0.1_007_JavaSE", \ |
| javax.rmi;uses:="org.omg.CORBA,javax.rmi.CORBA";version="0.0.0.1_007_JavaSE", \ |
| javax.script;version="0.0.0.1_007_JavaSE", \ |
| javax.security.auth.callback;version="0.0.0.1_007_JavaSE", \ |
| javax.security.auth.kerberos;uses:="javax.security.auth,javax.crypto";version="0.0.0.1_007_JavaSE", \ |
| javax.security.auth.login;uses:="javax.security.auth,javax.security.auth.callback";version="0.0.0.1_007_JavaSE", \ |
| javax.security.auth.spi;uses:="javax.security.auth.callback,javax.security.auth.login,javax.security.auth";version="0.0.0.1_007_JavaSE", \ |
| javax.security.auth.x500;uses:="javax.security.auth";version="0.0.0.1_007_JavaSE", \ |
| javax.security.auth;version="0.0.0.1_007_JavaSE", \ |
| javax.security.cert;version="0.0.0.1_007_JavaSE", \ |
| javax.security.sasl;uses:="javax.security.auth.callback";version="0.0.0.1_007_JavaSE", \ |
| javax.sound.midi.spi;uses:="javax.sound.midi";version="0.0.0.1_007_JavaSE", \ |
| javax.sound.midi;uses:="javax.sound.midi.spi";version="0.0.0.1_007_JavaSE", \ |
| javax.sound.sampled.spi;uses:="javax.sound.sampled";version="0.0.0.1_007_JavaSE", \ |
| javax.sound.sampled;uses:="javax.sound.sampled.spi";version="0.0.0.1_007_JavaSE", \ |
| javax.sql.rowset.serial;uses:="javax.sql.rowset";version="0.0.0.1_007_JavaSE", \ |
| javax.sql.rowset.spi;uses:="javax.sql,javax.naming,javax.sql.rowset";version="0.0.0.1_007_JavaSE", \ |
| javax.sql.rowset;uses:="javax.sql,javax.sql.rowset.serial,javax.sql.rowset.spi";version="0.0.0.1_007_JavaSE", \ |
| javax.sql;uses:="javax.transaction.xa";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.border;uses:="javax.swing";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.colorchooser;uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.text";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.event;uses:="javax.swing,javax.swing.text,javax.swing.table,javax.swing.tree,javax.swing.undo";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.filechooser;uses:="javax.swing";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.plaf.basic;uses:="javax.swing.border,javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.event,javax.swing.colorchooser,javax.accessibility,javax.swing.filechooser,javax.swing.text.html,javax.sound.sampled,javax.swing.table,javax.swing.plaf.synth,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.plaf.metal;uses:="javax.swing.plaf,javax.swing,javax.swing.border,javax.swing.text,javax.swing.plaf.basic,javax.swing.filechooser,javax.swing.event,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.plaf.multi;uses:="javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.plaf.nimbus;uses:="javax.swing,javax.swing.plaf,javax.swing.border,javax.swing.plaf.synth";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.plaf.synth;uses:="javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.border,javax.swing.plaf.basic,javax.swing.colorchooser,javax.swing.event,javax.xml.parsers,org.xml.sax,org.xml.sax.helpers,javax.swing.table,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.plaf;uses:="javax.swing,javax.swing.border,javax.accessibility,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.table;uses:="javax.swing.event,javax.swing.plaf,javax.swing.border,javax.swing,javax.accessibility";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.text.html.parser;uses:="javax.swing.text,javax.swing.text.html";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.text.html;uses:="javax.swing.event,javax.swing.text,javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.border,javax.swing.undo";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.text.rtf;uses:="javax.swing.text";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.text;uses:="javax.swing.event,javax.swing.tree,javax.swing.undo,javax.swing,javax.swing.plaf,javax.swing.plaf.basic,javax.print,javax.print.attribute,javax.accessibility,javax.swing.text.html";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.tree;uses:="javax.swing.event,javax.swing,javax.swing.border,javax.swing.plaf,javax.swing.plaf.basic";version="0.0.0.1_007_JavaSE", \ |
| javax.swing.undo;uses:="javax.swing,javax.swing.event";version="0.0.0.1_007_JavaSE", \ |
| javax.swing;uses:="javax.swing.event,javax.accessibility,javax.swing.text,javax.swing.plaf,javax.swing.border,javax.swing.tree,javax.swing.table,javax.swing.colorchooser,javax.swing.plaf.basic,javax.swing.text.html,javax.swing.filechooser,javax.print,javax.print.attribute,javax.swing.plaf.metal";version="0.0.0.1_007_JavaSE", \ |
| javax.tools;uses:="javax.lang.model.element,javax.annotation.processing,javax.lang.model";version="0.0.0.1_007_JavaSE", \ |
| javax.transaction.xa;version="0.0.0.1_007_JavaSE", \ |
| javax.transaction;version="0.0.0.1_007_JavaSE", \ |
| javax.xml.bind.annotation.adapters;uses:="javax.xml.bind";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.bind.annotation;uses:="javax.xml.transform,javax.xml.bind,javax.xml.parsers,javax.xml.transform.dom,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.bind.attachment;uses:="javax.activation";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.bind.helpers;uses:="javax.xml.bind.annotation.adapters,javax.xml.transform.dom,org.w3c.dom,org.xml.sax,javax.xml.bind.attachment,javax.xml.stream,javax.xml.transform,javax.xml.transform.stream,javax.xml.validation,javax.xml.transform.sax,javax.xml.bind,javax.xml.parsers";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.bind.util;uses:="javax.xml.transform.sax,javax.xml.bind,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.bind;uses:="javax.xml.validation,javax.xml.namespace,javax.xml.datatype,javax.xml.transform,javax.xml.bind.annotation,javax.xml.transform.stream,org.w3c.dom,javax.xml.bind.attachment,javax.xml.stream,javax.xml.bind.annotation.adapters,org.xml.sax";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.crypto.dom;uses:="javax.xml.crypto,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.crypto.dsig.dom;uses:="javax.xml.crypto.dsig,javax.xml.crypto,org.w3c.dom,javax.xml.crypto.dom";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.crypto.dsig.keyinfo;uses:="javax.xml.crypto";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.crypto.dsig.spec;uses:="javax.xml.crypto";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.crypto.dsig;uses:="javax.xml.crypto,javax.xml.crypto.dsig.spec,javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.crypto;uses:="javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.datatype;uses:="javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.namespace;version="0.0.0.1_007_JavaSE", \ |
| javax.xml.parsers;uses:="javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.soap;uses:="javax.activation,javax.xml.namespace,org.w3c.dom,javax.xml.transform.dom,javax.xml.transform";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.stream.events;uses:="javax.xml.namespace,javax.xml.stream";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.stream.util;uses:="javax.xml.stream,javax.xml.stream.events,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.stream;uses:="javax.xml.stream.events,javax.xml.namespace,javax.xml.stream.util,javax.xml.transform";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.transform.dom;uses:="javax.xml.transform,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.transform.sax;uses:="org.xml.sax.ext,javax.xml.transform,org.xml.sax,javax.xml.transform.stream";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.transform.stax;uses:="javax.xml.stream,javax.xml.transform,javax.xml.stream.events";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.transform.stream;uses:="javax.xml.transform";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.transform;version="0.0.0.1_007_JavaSE", \ |
| javax.xml.validation;uses:="org.w3c.dom.ls,javax.xml.transform,javax.xml.transform.stream,org.xml.sax,org.w3c.dom";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws.handler.soap;uses:="javax.xml.ws.handler,javax.xml.namespace,javax.xml.soap,javax.xml.bind";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws.handler;uses:="javax.xml.ws,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws.http;uses:="javax.xml.ws";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws.soap;uses:="javax.xml.ws.spi,javax.xml.ws,javax.xml.soap";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws.spi.http;version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws.spi;uses:="javax.xml.ws,javax.xml.ws.wsaddressing,javax.xml.transform,org.w3c.dom,javax.xml.namespace,javax.xml.ws.handler,javax.xml.bind";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws.wsaddressing;uses:="javax.xml.bind.annotation,javax.xml.namespace,org.w3c.dom,javax.xml.transform,javax.xml.bind,javax.xml.ws,javax.xml.ws.spi";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.ws;uses:="javax.xml.ws.handler,javax.xml.ws.spi,javax.xml.ws.spi.http,javax.xml.transform,org.w3c.dom,javax.xml.bind.annotation,javax.xml.transform.stream,javax.xml.bind,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ |
| javax.xml.xpath;uses:="org.xml.sax,javax.xml.namespace";version="0.0.0.1_007_JavaSE", \ |
| javax.xml;version="0.0.0.1_007_JavaSE", \ |
| org.ietf.jgss;version="0.0.0.1_007_JavaSE", \ |
| org.omg.CORBA.DynAnyPackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CORBA.ORBPackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CORBA.TypeCodePackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CORBA.portable;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CORBA;uses:="org.omg.CORBA.portable,org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA_2_3.portable,org.omg.CORBA.TypeCodePackage";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CORBA_2_3.portable;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CORBA_2_3;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CosNaming.NamingContextExtPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CosNaming.NamingContextPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming";version="0.0.0.1_007_JavaSE", \ |
| org.omg.CosNaming;uses:="org.omg.CORBA.portable,org.omg.CORBA,org.omg.PortableServer,org.omg.CosNaming.NamingContextPackage,org.omg.CosNaming.NamingContextExtPackage";version="0.0.0.1_007_JavaSE", \ |
| org.omg.Dynamic;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.DynamicAny.DynAnyFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.DynamicAny.DynAnyPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.DynamicAny;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage";version="0.0.0.1_007_JavaSE", \ |
| org.omg.IOP.CodecFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.IOP.CodecPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.IOP;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage";version="0.0.0.1_007_JavaSE", \ |
| org.omg.Messaging;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableInterceptor.ORBInitInfoPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableInterceptor;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP,org.omg.PortableInterceptor.ORBInitInfoPackage,org.omg.CORBA_2_3.portable,org.omg.Dynamic";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableServer.CurrentPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableServer.POAManagerPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableServer.POAPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableServer.ServantLocatorPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableServer.portable;uses:="org.omg.CORBA,org.omg.PortableServer";version="0.0.0.1_007_JavaSE", \ |
| org.omg.PortableServer;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.portable,org.omg.CORBA_2_3,org.omg.PortableServer.ServantLocatorPackage";version="0.0.0.1_007_JavaSE", \ |
| org.omg.SendingContext;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", \ |
| org.omg.stub.java.rmi;uses:="javax.rmi.CORBA";version="0.0.0.1_007_JavaSE", \ |
| org.w3c.dom.bootstrap;uses:="org.w3c.dom";version="0.0.0.1_007_JavaSE", \ |
| org.w3c.dom.events;uses:="org.w3c.dom,org.w3c.dom.views";version="0.0.0.1_007_JavaSE", \ |
| org.w3c.dom.ls;uses:="org.w3c.dom,org.w3c.dom.events,org.w3c.dom.traversal";version="0.0.0.1_007_JavaSE", \ |
| org.w3c.dom;version="0.0.0.1_007_JavaSE", \ |
| org.xml.sax.ext;uses:="org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", \ |
| org.xml.sax.helpers;uses:="org.xml.sax";version="0.0.0.1_007_JavaSE", \ |
| org.xml.sax;version="0.0.0.1_007_JavaSE" |
| ---- |
| |
| Remove the definition for the `javax.transaction` packages, and remove |
| the `uses:=` clause for the `javax.sql` packages (but leaving the |
| `version` clause). Concatenate all the lines together. You'll wind up |
| with something like this in your `conf/config.properties` file: |
| |
| [source,properties] |
| ---- |
| org.osgi.framework.system.packages=org.osgi.framework;version=1.7.0, org.osgi.framework.hooks.bundle;version=1.1.0, org.osgi.framework.hooks.resolver;version=1.0.0, org.osgi.framework.hooks.service;version=1.1.0, org.osgi.framework.hooks.weaving;version=1.0.0, org.osgi.framework.launch;version=1.1.0, org.osgi.framework.namespace;version=1.0.0, org.osgi.framework.startlevel;version=1.0.0, org.osgi.framework.wiring;version=1.1.0, org.osgi.resource;version=1.0.0, org.osgi.service.packageadmin; version=1.2.0, org.osgi.service.startlevel; version=1.1.0, org.osgi.service.url;version=1.0.0, org.osgi.util.tracker;version=1.5.1 javax.accessibility;uses:="javax.swing.text";version="0.0.0.1_007_JavaSE", javax.activation;version="0.0.0.1_007_JavaSE", javax.activity;version="0.0.0.1_007_JavaSE", javax.annotation.processing;uses:="javax.tools,javax.lang.model,javax.lang.model.element,javax.lang.model.util";version="0.0.0.1_007_JavaSE", javax.annotation;version="0.0.0.1_007_JavaSE", javax.crypto.interfaces;uses:="javax.crypto.spec,javax.crypto";version="0.0.0.1_007_JavaSE", javax.crypto.spec;uses:="javax.crypto";version="0.0.0.1_007_JavaSE", javax.crypto;uses:="javax.crypto.spec";version="0.0.0.1_007_JavaSE", javax.imageio.event;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", javax.imageio.metadata;uses:="org.w3c.dom,javax.imageio";version="0.0.0.1_007_JavaSE", javax.imageio.plugins.bmp;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", javax.imageio.plugins.jpeg;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", javax.imageio.spi;uses:="javax.imageio.stream,javax.imageio,javax.imageio.metadata";version="0.0.0.1_007_JavaSE", javax.imageio.stream;uses:="javax.imageio";version="0.0.0.1_007_JavaSE", javax.imageio;uses:="javax.imageio.metadata,javax.imageio.stream,javax.imageio.spi,javax.imageio.event";version="0.0.0.1_007_JavaSE", javax.jws.soap;version="0.0.0.1_007_JavaSE", javax.jws;version="0.0.0.1_007_JavaSE", javax.lang.model.element;uses:="javax.lang.model.type,javax.lang.model";version="0.0.0.1_007_JavaSE", javax.lang.model.type;uses:="javax.lang.model.element,javax.lang.model";version="0.0.0.1_007_JavaSE", javax.lang.model.util;uses:="javax.lang.model,javax.lang.model.element,javax.annotation.processing,javax.lang.model.type";version="0.0.0.1_007_JavaSE", javax.lang.model;version="0.0.0.1_007_JavaSE", javax.management.loading;uses:="javax.management";version="0.0.0.1_007_JavaSE", javax.management.modelmbean;uses:="javax.management,javax.management.loading";version="0.0.0.1_007_JavaSE", javax.management.monitor;uses:="javax.management";version="0.0.0.1_007_JavaSE", javax.management.openmbean;uses:="javax.management";version="0.0.0.1_007_JavaSE", javax.management.relation;uses:="javax.management";version="0.0.0.1_007_JavaSE", javax.management.remote.rmi;uses:="javax.management.remote,javax.security.auth,javax.management,javax.management.loading,javax.naming,javax.rmi.ssl,org.omg.CORBA,org.omg.CORBA_2_3.portable,org.omg.CORBA.portable,javax.rmi.CORBA,javax.rmi";version="0.0.0.1_007_JavaSE", javax.management.remote;uses:="javax.security.auth,javax.management";version="0.0.0.1_007_JavaSE", javax.management.timer;uses:="javax.management";version="0.0.0.1_007_JavaSE", javax.management;uses:="javax.management.loading,javax.management.openmbean";version="0.0.0.1_007_JavaSE", javax.naming.directory;uses:="javax.naming";version="0.0.0.1_007_JavaSE", javax.naming.event;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_007_JavaSE", javax.naming.ldap;uses:="javax.naming,javax.naming.directory,javax.net.ssl,javax.naming.event";version="0.0.0.1_007_JavaSE", javax.naming.spi;uses:="javax.naming,javax.naming.directory";version="0.0.0.1_007_JavaSE", javax.naming;uses:="javax.naming.spi";version="0.0.0.1_007_JavaSE", javax.net.ssl;uses:="javax.security.cert,javax.security.auth.x500,javax.net";version="0.0.0.1_007_JavaSE", javax.net;version="0.0.0.1_007_JavaSE", javax.print.attribute.standard;uses:="javax.print.attribute";version="0.0.0.1_007_JavaSE", javax.print.attribute;version="0.0.0.1_007_JavaSE", javax.print.event;uses:="javax.print,javax.print.attribute";version="0.0.0.1_007_JavaSE", javax.print;uses:="javax.print.attribute,javax.print.event,javax.print.attribute.standard";version="0.0.0.1_007_JavaSE", javax.rmi.CORBA;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable,org.omg.CORBA.portable,org.omg.SendingContext";version="0.0.0.1_007_JavaSE", javax.rmi.ssl;uses:="javax.net,javax.net.ssl";version="0.0.0.1_007_JavaSE", javax.rmi;uses:="org.omg.CORBA,javax.rmi.CORBA";version="0.0.0.1_007_JavaSE", javax.script;version="0.0.0.1_007_JavaSE", javax.security.auth.callback;version="0.0.0.1_007_JavaSE", javax.security.auth.kerberos;uses:="javax.security.auth,javax.crypto";version="0.0.0.1_007_JavaSE", javax.security.auth.login;uses:="javax.security.auth,javax.security.auth.callback";version="0.0.0.1_007_JavaSE", javax.security.auth.spi;uses:="javax.security.auth.callback,javax.security.auth.login,javax.security.auth";version="0.0.0.1_007_JavaSE", javax.security.auth.x500;uses:="javax.security.auth";version="0.0.0.1_007_JavaSE", javax.security.auth;version="0.0.0.1_007_JavaSE", javax.security.cert;version="0.0.0.1_007_JavaSE", javax.security.sasl;uses:="javax.security.auth.callback";version="0.0.0.1_007_JavaSE", javax.sound.midi.spi;uses:="javax.sound.midi";version="0.0.0.1_007_JavaSE", javax.sound.midi;uses:="javax.sound.midi.spi";version="0.0.0.1_007_JavaSE", javax.sound.sampled.spi;uses:="javax.sound.sampled";version="0.0.0.1_007_JavaSE", javax.sound.sampled;uses:="javax.sound.sampled.spi";version="0.0.0.1_007_JavaSE", javax.sql.rowset.serial;version="0.0.0.1_007_JavaSE", javax.sql.rowset.spi;version="0.0.0.1_007_JavaSE", javax.sql.rowset;version="0.0.0.1_007_JavaSE", javax.sql;version="0.0.0.1_007_JavaSE", javax.swing.border;uses:="javax.swing";version="0.0.0.1_007_JavaSE", javax.swing.colorchooser;uses:="javax.swing,javax.swing.border,javax.swing.event,javax.swing.text";version="0.0.0.1_007_JavaSE", javax.swing.event;uses:="javax.swing,javax.swing.text,javax.swing.table,javax.swing.tree,javax.swing.undo";version="0.0.0.1_007_JavaSE", javax.swing.filechooser;uses:="javax.swing";version="0.0.0.1_007_JavaSE", javax.swing.plaf.basic;uses:="javax.swing.border,javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.event,javax.swing.colorchooser,javax.accessibility,javax.swing.filechooser,javax.swing.text.html,javax.sound.sampled,javax.swing.table,javax.swing.plaf.synth,javax.swing.tree";version="0.0.0.1_007_JavaSE", javax.swing.plaf.metal;uses:="javax.swing.plaf,javax.swing,javax.swing.border,javax.swing.text,javax.swing.plaf.basic,javax.swing.filechooser,javax.swing.event,javax.swing.tree";version="0.0.0.1_007_JavaSE", javax.swing.plaf.multi;uses:="javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_007_JavaSE", javax.swing.plaf.nimbus;uses:="javax.swing,javax.swing.plaf,javax.swing.border,javax.swing.plaf.synth";version="0.0.0.1_007_JavaSE", javax.swing.plaf.synth;uses:="javax.swing,javax.swing.plaf,javax.swing.text,javax.swing.border,javax.swing.plaf.basic,javax.swing.colorchooser,javax.swing.event,javax.xml.parsers,org.xml.sax,org.xml.sax.helpers,javax.swing.table,javax.swing.tree";version="0.0.0.1_007_JavaSE", javax.swing.plaf;uses:="javax.swing,javax.swing.border,javax.accessibility,javax.swing.filechooser,javax.swing.text,javax.swing.tree";version="0.0.0.1_007_JavaSE", javax.swing.table;uses:="javax.swing.event,javax.swing.plaf,javax.swing.border,javax.swing,javax.accessibility";version="0.0.0.1_007_JavaSE", javax.swing.text.html.parser;uses:="javax.swing.text,javax.swing.text.html";version="0.0.0.1_007_JavaSE", javax.swing.text.html;uses:="javax.swing.event,javax.swing.text,javax.accessibility,javax.swing,javax.swing.plaf,javax.swing.border,javax.swing.undo";version="0.0.0.1_007_JavaSE", javax.swing.text.rtf;uses:="javax.swing.text";version="0.0.0.1_007_JavaSE", javax.swing.text;uses:="javax.swing.event,javax.swing.tree,javax.swing.undo,javax.swing,javax.swing.plaf,javax.swing.plaf.basic,javax.print,javax.print.attribute,javax.accessibility,javax.swing.text.html";version="0.0.0.1_007_JavaSE", javax.swing.tree;uses:="javax.swing.event,javax.swing,javax.swing.border,javax.swing.plaf,javax.swing.plaf.basic";version="0.0.0.1_007_JavaSE", javax.swing.undo;uses:="javax.swing,javax.swing.event";version="0.0.0.1_007_JavaSE", javax.swing;uses:="javax.swing.event,javax.accessibility,javax.swing.text,javax.swing.plaf,javax.swing.border,javax.swing.tree,javax.swing.table,javax.swing.colorchooser,javax.swing.plaf.basic,javax.swing.text.html,javax.swing.filechooser,javax.print,javax.print.attribute,javax.swing.plaf.metal";version="0.0.0.1_007_JavaSE", javax.tools;uses:="javax.lang.model.element,javax.annotation.processing,javax.lang.model";version="0.0.0.1_007_JavaSE", javax.xml.bind.annotation.adapters;uses:="javax.xml.bind";version="0.0.0.1_007_JavaSE", javax.xml.bind.annotation;uses:="javax.xml.transform,javax.xml.bind,javax.xml.parsers,javax.xml.transform.dom,org.w3c.dom";version="0.0.0.1_007_JavaSE", javax.xml.bind.attachment;uses:="javax.activation";version="0.0.0.1_007_JavaSE", javax.xml.bind.helpers;uses:="javax.xml.bind.annotation.adapters,javax.xml.transform.dom,org.w3c.dom,org.xml.sax,javax.xml.bind.attachment,javax.xml.stream,javax.xml.transform,javax.xml.transform.stream,javax.xml.validation,javax.xml.transform.sax,javax.xml.bind,javax.xml.parsers";version="0.0.0.1_007_JavaSE", javax.xml.bind.util;uses:="javax.xml.transform.sax,javax.xml.bind,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", javax.xml.bind;uses:="javax.xml.validation,javax.xml.namespace,javax.xml.datatype,javax.xml.transform,javax.xml.bind.annotation,javax.xml.transform.stream,org.w3c.dom,javax.xml.bind.attachment,javax.xml.stream,javax.xml.bind.annotation.adapters,org.xml.sax";version="0.0.0.1_007_JavaSE", javax.xml.crypto.dom;uses:="javax.xml.crypto,org.w3c.dom";version="0.0.0.1_007_JavaSE", javax.xml.crypto.dsig.dom;uses:="javax.xml.crypto.dsig,javax.xml.crypto,org.w3c.dom,javax.xml.crypto.dom";version="0.0.0.1_007_JavaSE", javax.xml.crypto.dsig.keyinfo;uses:="javax.xml.crypto";version="0.0.0.1_007_JavaSE", javax.xml.crypto.dsig.spec;uses:="javax.xml.crypto";version="0.0.0.1_007_JavaSE", javax.xml.crypto.dsig;uses:="javax.xml.crypto,javax.xml.crypto.dsig.spec,javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_007_JavaSE", javax.xml.crypto;uses:="javax.xml.crypto.dsig.keyinfo";version="0.0.0.1_007_JavaSE", javax.xml.datatype;uses:="javax.xml.namespace";version="0.0.0.1_007_JavaSE", javax.xml.namespace;version="0.0.0.1_007_JavaSE", javax.xml.parsers;uses:="javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", javax.xml.soap;uses:="javax.activation,javax.xml.namespace,org.w3c.dom,javax.xml.transform.dom,javax.xml.transform";version="0.0.0.1_007_JavaSE", javax.xml.stream.events;uses:="javax.xml.namespace,javax.xml.stream";version="0.0.0.1_007_JavaSE", javax.xml.stream.util;uses:="javax.xml.stream,javax.xml.stream.events,javax.xml.namespace";version="0.0.0.1_007_JavaSE", javax.xml.stream;uses:="javax.xml.stream.events,javax.xml.namespace,javax.xml.stream.util,javax.xml.transform";version="0.0.0.1_007_JavaSE", javax.xml.transform.dom;uses:="javax.xml.transform,org.w3c.dom";version="0.0.0.1_007_JavaSE", javax.xml.transform.sax;uses:="org.xml.sax.ext,javax.xml.transform,org.xml.sax,javax.xml.transform.stream";version="0.0.0.1_007_JavaSE", javax.xml.transform.stax;uses:="javax.xml.stream,javax.xml.transform,javax.xml.stream.events";version="0.0.0.1_007_JavaSE", javax.xml.transform.stream;uses:="javax.xml.transform";version="0.0.0.1_007_JavaSE", javax.xml.transform;version="0.0.0.1_007_JavaSE", javax.xml.validation;uses:="org.w3c.dom.ls,javax.xml.transform,javax.xml.transform.stream,org.xml.sax,org.w3c.dom";version="0.0.0.1_007_JavaSE", javax.xml.ws.handler.soap;uses:="javax.xml.ws.handler,javax.xml.namespace,javax.xml.soap,javax.xml.bind";version="0.0.0.1_007_JavaSE", javax.xml.ws.handler;uses:="javax.xml.ws,javax.xml.namespace";version="0.0.0.1_007_JavaSE", javax.xml.ws.http;uses:="javax.xml.ws";version="0.0.0.1_007_JavaSE", javax.xml.ws.soap;uses:="javax.xml.ws.spi,javax.xml.ws,javax.xml.soap";version="0.0.0.1_007_JavaSE", javax.xml.ws.spi.http;version="0.0.0.1_007_JavaSE", javax.xml.ws.spi;uses:="javax.xml.ws,javax.xml.ws.wsaddressing,javax.xml.transform,org.w3c.dom,javax.xml.namespace,javax.xml.ws.handler,javax.xml.bind";version="0.0.0.1_007_JavaSE", javax.xml.ws.wsaddressing;uses:="javax.xml.bind.annotation,javax.xml.namespace,org.w3c.dom,javax.xml.transform,javax.xml.bind,javax.xml.ws,javax.xml.ws.spi";version="0.0.0.1_007_JavaSE", javax.xml.ws;uses:="javax.xml.ws.handler,javax.xml.ws.spi,javax.xml.ws.spi.http,javax.xml.transform,org.w3c.dom,javax.xml.bind.annotation,javax.xml.transform.stream,javax.xml.bind,javax.xml.namespace";version="0.0.0.1_007_JavaSE", javax.xml.xpath;uses:="org.xml.sax,javax.xml.namespace";version="0.0.0.1_007_JavaSE", javax.xml;version="0.0.0.1_007_JavaSE", org.ietf.jgss;version="0.0.0.1_007_JavaSE", org.omg.CORBA.DynAnyPackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", org.omg.CORBA.ORBPackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", org.omg.CORBA.TypeCodePackage;uses:="org.omg.CORBA";version="0.0.0.1_007_JavaSE", org.omg.CORBA.portable;uses:="org.omg.CORBA,org.omg.CORBA_2_3.portable";version="0.0.0.1_007_JavaSE", org.omg.CORBA;uses:="org.omg.CORBA.portable,org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA_2_3.portable,org.omg.CORBA.TypeCodePackage";version="0.0.0.1_007_JavaSE", org.omg.CORBA_2_3.portable;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.CORBA_2_3;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.CosNaming.NamingContextExtPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.CosNaming.NamingContextPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.CosNaming";version="0.0.0.1_007_JavaSE", org.omg.CosNaming;uses:="org.omg.CORBA.portable,org.omg.CORBA,org.omg.PortableServer,org.omg.CosNaming.NamingContextPackage,org.omg.CosNaming.NamingContextExtPackage";version="0.0.0.1_007_JavaSE", org.omg.Dynamic;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.DynamicAny.DynAnyFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.DynamicAny.DynAnyPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.DynamicAny;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage";version="0.0.0.1_007_JavaSE", org.omg.IOP.CodecFactoryPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.IOP.CodecPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.IOP;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage";version="0.0.0.1_007_JavaSE", org.omg.Messaging;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.PortableInterceptor.ORBInitInfoPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.PortableInterceptor;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.IOP,org.omg.PortableInterceptor.ORBInitInfoPackage,org.omg.CORBA_2_3.portable,org.omg.Dynamic";version="0.0.0.1_007_JavaSE", org.omg.PortableServer.CurrentPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.PortableServer.POAManagerPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.PortableServer.POAPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.PortableServer.ServantLocatorPackage;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.PortableServer.portable;uses:="org.omg.CORBA,org.omg.PortableServer";version="0.0.0.1_007_JavaSE", org.omg.PortableServer;uses:="org.omg.CORBA,org.omg.CORBA.portable,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.portable,org.omg.CORBA_2_3,org.omg.PortableServer.ServantLocatorPackage";version="0.0.0.1_007_JavaSE", org.omg.SendingContext;uses:="org.omg.CORBA,org.omg.CORBA.portable";version="0.0.0.1_007_JavaSE", org.omg.stub.java.rmi;uses:="javax.rmi.CORBA";version="0.0.0.1_007_JavaSE", org.w3c.dom.bootstrap;uses:="org.w3c.dom";version="0.0.0.1_007_JavaSE", org.w3c.dom.events;uses:="org.w3c.dom,org.w3c.dom.views";version="0.0.0.1_007_JavaSE", org.w3c.dom.ls;uses:="org.w3c.dom,org.w3c.dom.events,org.w3c.dom.traversal";version="0.0.0.1_007_JavaSE", org.w3c.dom;version="0.0.0.1_007_JavaSE", org.xml.sax.ext;uses:="org.xml.sax,org.xml.sax.helpers";version="0.0.0.1_007_JavaSE", org.xml.sax.helpers;uses:="org.xml.sax";version="0.0.0.1_007_JavaSE", org.xml.sax;version="0.0.0.1_007_JavaSE" |
| ---- |
| |
| You should now be able to start Felix, and deploy all the jars listed on |
| this page. You should see output similar to this on the console, using |
| the `felix:lb` command: |
| |
| .... |
| ID|State |Level|Name |
| 0|Active | 0|System Bundle (4.4.1) |
| 1|Active | 1|ASM (5.0.1) |
| 2|Active | 1|ASM commons classes (5.0.1) |
| 3|Active | 1|ASM Tree class visitor (5.0.1) |
| 4|Active | 1|geronimo-jta_1.1_spec (1.1.1) |
| 5|Active | 1|javax.annotation API (1.2.0) |
| 6|Active | 1|javax.mail bundle from Glassfish (1.4.1.v201005082020) |
| 7|Active | 1|Java Server Pages Standard Tag Library API Bundle (1.2.0.v201105211821) |
| 8|Active | 1|JavaServer Pages (TM) TagLib Implementation (1.2.2) |
| 9|Active | 1|Jetty :: Servlet Annotations (9.2.4.SNAPSHOT) |
| 10|Active | 1|Jetty :: Deployers (9.2.4.SNAPSHOT) |
| 11|Active | 1|Jetty :: Http Utility (9.2.4.SNAPSHOT) |
| 12|Active | 1|Jetty :: IO Utility (9.2.4.SNAPSHOT) |
| 13|Active | 1|Jetty :: JNDI Naming (9.2.4.SNAPSHOT) |
| 14|Active | 1|Jetty :: OSGi :: Boot (9.2.4.SNAPSHOT) |
| 15|Resolved | 1|Jetty-OSGi-Jasper Integration (9.2.4.SNAPSHOT) |
| 16|Active | 1|Jetty Servlet API and Schemas for OSGi (3.1.0.SNAPSHOT) |
| 17|Active | 1|Jetty :: Plus (9.2.4.SNAPSHOT) |
| 18|Active | 1|Jetty :: Security (9.2.4.SNAPSHOT) |
| 19|Active | 1|Jetty :: Server Core (9.2.4.SNAPSHOT) |
| 20|Active | 1|Jetty :: Servlet Handling (9.2.4.SNAPSHOT) |
| 21|Active | 1|Jetty :: Utility Servlets and Filters (9.2.4.SNAPSHOT) |
| 22|Active | 1|Jetty :: Utilities (9.2.4.SNAPSHOT) |
| 23|Active | 1|Jetty :: Webapp Application Support (9.2.4.SNAPSHOT) |
| 24|Active | 1|Jetty :: XML utilities (9.2.4.SNAPSHOT) |
| 25|Active | 1|Apache Aries SPI Fly Dynamic Weaving Bundle (1.0.1) |
| 26|Active | 1|Apache Aries Util (1.0.0) |
| 27|Active | 1|Apache Felix Bundle Repository (2.0.2) |
| 28|Active | 1|Apache Felix Configuration Admin Service (1.8.0) |
| 29|Active | 1|Apache Felix EventAdmin (1.3.2) |
| 30|Active | 1|Apache Felix Gogo Command (0.14.0) |
| 31|Active | 1|Apache Felix Gogo Runtime (0.12.1) |
| 32|Active | 1|Apache Felix Gogo Shell (0.10.0) |
| 33|Active | 1|Apache Felix Log Service (1.0.1) |
| 34|Active | 1|Jetty :: Apache JSP (9.2.4.SNAPSHOT) |
| 35|Active | 1|Eclipse Compiler for Java(TM) (3.8.2.v20130121-145325) |
| 36|Active | 1|Mortbay EL API and Implementation (8.0.9) |
| 37|Active | 1|Mortbay Jasper (8.0.9) |
| .... |
| |
| ===== Eclipse |
| |
| The jetty OSGi integration has been successfully tested against |
| https://www.eclipse.org/equinox/[Equinox] Mars RC1. |
| |
| Ensure that these services are present: |
| |
| * https://www.eclipse.org/equinox/bundles/[Configuration Admin] |
| * https://www.eclipse.org/equinox/bundles/[Event Admin] |
| |
| ====== Eclipse Update Site |
| |
| There is a list of Eclipse P2 sites for the jetty releases maintained at |
| http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/ |
| |
| Each P2 repo has one big feature group that defines most of the jetty |
| jars. *Beware: No 3rd party dependency jars are included, so you will |
| need to have installed the dependencies listed previously in this |
| document.* |
| |
| In addition, as the feature group includes websocket, you will need to |
| download and have installed the javax.websocket-api jar: |
| |
| .Extra Jars Required for Websocket |
| [cols=",,",options="header",] |
| |======================================================================= |
| |Jar |Bundle Symbolic Name |Location |
| |javax.websocket-api |javax.websocket-api |
| |http://central.maven.org/maven2/javax/websocket/websocket-api[Maven |
| central] |
| |======================================================================= |