How to convert Elasticsearch Java API Client into OSGI bundle? - java

I want to convert Elasticsearch Java API Client into an OSGI bundle as it is not readily available anywhere. I tried the following command to create one on my own but it not work. I also tried maven bundle plugins but it resulted in the same error. What am I doing wrong?
jar cvfm osgi-elasticsearch-java-8.0.1.jar ./MANIFEST.txt elasticsearch-java-8.0.1.jar
The MANIFEST use is as follows:
Manifest-Version: 1.0
Bundle-Category: OSGI ELK
Bundle-Description: Elastic Search Client Bundle
Bundle-ManifestVersion: 2
Bundle-Name: OSGI ELK - HG
Bundle-SymbolicName: osgi-elk.hg
Bundle-Version: 1.7.0
Bundle-ClassPath: .,elasticsearch-java-8.0.1.jar
Export-Package: co.elastic.clients.elasticsearch, co.elastic.clients.elasticsearch.indices, co.elastic.clients.json, co.elastic.clients.json.jackson, co.elastic.clients.transport, co.elastic.clients.transport.rest_client
The following classes are not available after installing the manually created Elasticsearch Java API Client OSGI bundle to a OSGI container.
co.elastic.clients.elasticsearch -- Cannot be resolved
co.elastic.clients.elasticsearch.indices -- Cannot be resolved
co.elastic.clients.json -- Cannot be resolved
co.elastic.clients.json.jackson -- Cannot be resolved
co.elastic.clients.transport -- Cannot be resolved
co.elastic.clients.transport.rest_client -- Cannot be resolved

Related

java.lang.NoClassDefFoundError: org/json/JSONObject when Java Class runs on OAM Server

I'm getting java.lang.NoClassDefFoundError: org/json/JSONObject when i'm running my .class on Oracle Access Manager
This is the stacktrace:
java.lang.NoClassDefFoundError: org/json/JSONObject
at phillplugin.PhillPlugin.process(PhillPlugin.java:118)
PhillPlugin.java:118 contains just a creation of an instance of a JSONObject
//Line 118:
JSONObject x = new JSONObject();
I'm using JDeveloper IDE and i have included the org.json.jar in my Libraries and in my Deployment profile
Note that when i'm executing it from a simple main.class it runs perfectly
I have to include the org.json.jar in the MANIFEST.MF file of the deploying PhillPlugin.jar and i have done it as follows:
Manifest-Version: 1.0
Bundle-Version: 10
Bundle-Name: PhillPlugin
Bundle-Activator: phillplugin.PhillPlugin
Bundle-ManifestVersion: 2
Import-Package:
org.osgi.framework;version="1.3.0",
oracle.security.am.plugin,
oracle.security.am.plugin.authn,
oracle.security.am.plugin.impl,
oracle.security.am.plugin.api,
oracle.security.am.common.utilities.principal,
oracle.security.idm,
javax.security.auth,
org.json.JSONObject;resolution:=optional,
org.json.JSONArray;resolution:=optional,
org.json;resolution:=optional
Export-Package:
org.json.JSONObject;resolution:=optional,
org.json.JSONArray;resolution:=optional,
org.json;resolution:=optional
Bundle-SymbolicName: PhillPlugin
Bundle-ClassPath: org.json.jar,utilities.jar,oam-plugin.jar,felix.jar,identity-provider.jar
But still the server does not recognise my imports
Let me mention that the PhillPlugin.jar contains:
MANIFEST.MF
PhillPlugin.class - line 118 gives me the error only on the server
PhillPlugin.xml
I will be happy to provide you with any other extra information you need
I had to include the external library in both MANIFEST.MF(reference) as i correctly did, and also the org.json.jar in the final PhillPlugin.jar as well as the json libraries
This way the server was able to see my imports
Here is the sample that worked for me:
Note that, the exception was being triggered even if the org folder was missing or the org.json.jar was missing

OSGI kafka client bundle causes a framework exception due to missing constraint

Subject : OSGI Kafka client bundle causes a framework exception due to missing constraint
I downloaded the kafka-clients OSGI bundle (org.apache.servicemix.bundles.kafka-clients-0.11.0.1_1.jar) from Apache ServiceMix (https://mvnrepository.com/artifact/org.apache.servicemix.bundles/org.apache.servicemix.bundles.kafka-clients/0.11.0.1_1).
Below is my pom.xml
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.kafka-clients</artifactId>
<version>0.11.0.1_1</version>
</dependency>
I used this to develop my Kafka producer code within the sflow_collector module of my application built using OSGI.
Everything compiles, no issue there.
When I run my application, I get the following error during the loading of the sflow_collector module.
org.osgi.framework.BundleException: The bundle "sflow-collector_1.0.0 [49]" could not be resolved. Reason: Missing Constraint: Import-Package: org.apache.kafka.clients.producer; version="[0.11.0,1.0.0)"
I checked the manifest of the Kafka OSGI bundle, it looks fine. I see the producer in the export list (shown in bold below).
Manifest-Version: 1.0
Bnd-LastModified: 1508749231115
Build-Jdk: 1.8.0_111
Built-By: jbonofre
Bundle-Description: This OSGi bundle wraps kafka-clients 0.11.0.1 jar file.
Bundle-DocURL: http://www.apache.org/
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: Apache ServiceMix :: Bundles :: kafka-clients
Bundle-SymbolicName: org.apache.servicemix.bundles.kafka-clients
Bundle-Vendor: The Apache Software Foundation
Bundle-Version: 0.11.0.1_1
Created-By: Apache Maven Bundle Plugin
Export-Package:
org.apache.kafka.clients;version="0.11.0.1";uses:="org.apache.kafka.common,
org.apache.kafka.common.config,
org.apache.kafka.common.errors,
org.apache.kafka.common.internals,
org.apache.kafka.common.metrics,
org.apache.kafka.common.network,
org.apache.kafka.common.protocol,
org.apache.kafka.common.requests,
org.apache.kafka.common.utils",
org.apache.kafka.clients.admin;version="0.11.0.1";
uses:="org.apache.kafka.common,
org.apache.kafka.common.acl,
org.apache.kafka.common.annotation,
org.apache.kafka.common.config,
org.apache.kafka.common.errors",
org.apache.kafka.clients.consumer;version="0.11.0.1";
uses:="org.apache.kafka.clients.coumer.internals,
org.apache.kafka.common,
org.apache.kafka.common.config,
org.apache.kafka.common.errors,
org.apache.kafka.common.header,
org.apache.kafka.common.record,
org.apache.kafka.common.serialization",
org.apache.kafka.clients.consumer.internals;version="0.11.0.1";uses:="org.apache.kafka.clients,
org.apache.kafka.clients.consumer,
org.apache.kafka.common,
org.apache.kafka.common.errors,
org.apache.kafka.common.metrics,
org.apache.kafka.common.protocol,
org.apache.kafka.common.protocol.types,
org.apache.kafka.common.requests,
org.apache.kafka.common.serialization,
org.apache.kafka.common.utils",
org.apache.kafka.clients.producer;version="0.11.0.1";uses:="org.apache.kafka.clients.consumer,
org.apache.kafka.common,
org.apache.kafka.common.config,
org.apache.kafka.common.errors,
I am not able to fix this problem.
Any help much appreciated. Please email is any more info is required.
As you probably understood, the error message
Missing Constraint: Import-Package: org.apache.kafka.clients.producer; version="[0.11.0,1.0.0)
.. indicates that a bundle (probably your bundle) imports the 'clients.producer' package, while no bundle in the container exports that package with the given version. The version matches the kafka-clients bundle manifest that you pasted, so no problem there. My guess is that the kafka-clients bundle is not deployed in the container, and you have to deploy it as well as your own bundle.
Which container are you using? If it's Apache Karaf you might find some hints in this github project.

Servlet-API bundle not providing JavaServlet capability - felix.http.jetty cannot run

I am trying to get the org.apache.felix.http.jetty bundle working to provide a HTTP Service to my OSGi environment.
I also have the servlet-api bundle deployed, which exports the versioned packages, but does not provide the JavaServlet capability (as it probably should, based on the OSGi Alliance page on Reference Contracts).
Here's part of the MANIFEST of the servlet-api bundle
Export-Package: javax.servlet;uses:="javax.servlet.descriptor,javax.se
rvlet.annotation";version="3.1.0",javax.servlet.descriptor;version="3
.1.0",javax.servlet.annotation;uses:="javax.servlet";version="3.1.0",
javax.servlet.http;uses:="javax.servlet";version="3.1.0"
Implementation-Version: 3.1.0
Specification-Vendor: Oracle Corporation
Bundle-Name: Java Servlet API
Bundle-Vendor: GlassFish Community
Import-Package: javax.servlet;version="3.1.0",javax.servlet.annotation
;version="3.1.0",javax.servlet.descriptor;version="3.1.0",javax.servl
et.http;version="3.1.0"
The Provide-Capability header is not specified at all.
So, when I start the OSGi container, it complains with this error:
Unresolved requirements: [[org.apache.felix.http.jetty [28](R 28.0)]
osgi.contract; (&(osgi.contract=JavaServlet)(version=3.1))]
Anyone knows how this can be fixed?
You should be using org.apache.felix.http.servlet-api bundle from Felix itself.

(mis)understanding osgi bundle dependencies

I'm pretty new to osgi and bndtools, but in the past couple days have managed to get jar->bundle creation working using bnd ant task, plus wrapping of our 3rd party jars as bundles (for those not already defining an 'Export-Package' in the manifest file). I must comment that bndtools seems amazing for doing all the heavy lifting when it comes to exports and imports, so thank you to your hard work on this project!
i've got two issues that maybe you can shed some light on:
1
I'm trying to get the bundles to load in felix and am immediately running into resolution errors. In this basic scenario, we have our in-house bundle called omniquery_common, which uses several 3rd party jars, including gson. when i resolve i get this:
Unable to resolve <<INITIAL>> version=null:
missing requirement Require[osgi.identity]{}{filter=(osgi.identity=omniquery_common)} [caused by:
Unable to resolve omniquery_common version=1.0.0.0:
missing requirement Require[osgi.wiring.package]{}{filter=(&(osgi.wiring.package=com.google.gson)(version>=2.2.0)(!(version>=3.0.0)))}]
To me this says omniquery_common is importing com.google.gson (of a version at least 2.2 and less than 3.0). the gson bundle is exporting version 2.2.4, so this should satisfy its dependency, but is not.
can you help me understand how i am wiring this up wrong?
manifest for omniquery_common:
Manifest-Version: 1.0
Bnd-LastModified: 1442336803995
Bundle-ManifestVersion: 2
Bundle-Name: omniquery_common
Bundle-SymbolicName: omniquery_common
Bundle-Version: 1.0.0.0
Created-By: 1.8.0_40 (Oracle Corporation)
Export-Package: com.radian6.omni.common.osgi;version="1.0.0"
Import-Package: com.google.gson;version="[2.2,3)",com.radian6.omni.commo
n.util,org.apache.commons.io;version="[1.4,2)",org.apache.commons.lang;
version="[2.6,3)",org.junit
Private-Package: com.radian6.omni.common.core
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
Tool: Bnd-2.4.1.201501161923
manifest for gson:
Manifest-Version: 1.0
Export-Package: com.google.gson;version=2.2.4, com.google.gson.annotat
ions;version=2.2.4, com.google.gson.reflect;version=2.2.4, com.google
.gson.stream;version=2.2.4, com.google.gson.internal;version=2.2.4, c
om.google.gson.internal.bind;version=2.2.4
Bundle-ClassPath: .
Built-By: inder
Bundle-Name: Gson
Created-By: Apache Maven 3.0.4
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-Vendor: Google Gson Project
Bundle-ContactAddress: http://code.google.com/p/google-gson/
Bundle-Version: 2.2.4
Build-Jdk: 1.7.0_21
Bundle-ManifestVersion: 2
Bundle-Description: Google Gson library
Bundle-SymbolicName: com.google.gson
Archiver-Version: Plexus Archiver
2
if i alter the order of the bundles in the 'run requirements' list, putting the gson bundle before omniquery_common, i then get
Unable to resolve <<INITIAL>> version=null:
missing requirement Require[osgi.identity]{}{filter=(osgi.identity=com.google.gson)}
which i find unintuitive - i would have thought the bundle order in that list would not matter...?
The order of the requirements in the -runrequirements list does matter, because if there is an error early in the list then we don't bother trying to resolve everything below it. That is: once we know that the resolution cannot succeed, we just exit and print the first error we encountered.
The second error message you copied (when you put the GSON requirement first) suggests that you simply don't have the GSON bundle in your repository. Or, it is not in a repository that is visible to the resolver. The filter (osgi.identity=com.google.gson) fails, which means there is no resource with the identity com.google.gson.
This would also explain the first error message from your own omniquery_common bundle. The resolver cannot find any bundle exporting the package com.google.gson, which would make perfect sense if the GSON bundle is not there.
So, look into the repositories you are resolving against and what their indexes contain. If GSON really does appear to be in there, then I will need further info on to figure out the problem.
Incidentally, once you have this working, you shouldn't need to list GSON explicitly at all in -runrequirements. That is the point of the resolver: we will find all your dependencies based on the packages you used.

simple-xml NodeBuilder No Class Def Found Error on Raspberry Pi running Kura

I have an OSGi bundle that uses SimpleXML as an imported jar (The SimpleXML jar is well defined on the bundle class path and is included in the exported bundle), the bundle works fine in the Kura emulator inside Eclipse, But when the bundle is deployed to Raspberry Pi, starting the bundle will throw an error:
java.lang.NoClassDefFoundError: Could not initialize class org.simpleframework.xml.stream.NodeBuilder
Anyone has encountered this problem?
-- UPDATE: I got it to work by exporting and importing SimpleXML from my Bundle and having a simpleXML Bundle active as well on the device. (Which I don't think is the solution, but is working for now). Ideally the SimpleXML jar should work without being exposed outside my bundle.
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test
Bundle-SymbolicName: org.eclipse.kura.test.implementation
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Export-Package: org.eclipse.kura.test.implementation,
org.simpleframework.xml,
org.simpleframework.xml.convert,
org.simpleframework.xml.core,
org.simpleframework.xml.filter,
org.simpleframework.xml.strategy,
org.simpleframework.xml.stream,
org.simpleframework.xml.transform,
org.simpleframework.xml.util
Bundle-ClassPath: .,
jar/org.simpleframework.simple-xml.2.3.jar
Import-Package: org.eclipse.kura.test.api,
org.osgi.framework;version="1.7.0",
org.osgi.service.component;version="1.2.0",
org.simpleframework.xml,
org.simpleframework.xml.convert,
org.simpleframework.xml.core,
org.simpleframework.xml.filter,
org.simpleframework.xml.strategy,
org.simpleframework.xml.stream,
org.simpleframework.xml.transform,
org.simpleframework.xml.util
Service-Component: OSGI-INF/component.xml
Require-Bundle: slf4j.api
Bundle-ActivationPolicy: lazy

Categories

Resources