问题
I'm trying to develop onto Karaf an OSGi WAB containing a REST API and a call from a custom-made service. However, for some weird reason, the OSGi framework complains about an unsatisfied capability, osgi.component
.
I would like to know:
- How can I solve this issue?
- What is
osgi.component
bundle? Why is needed? - Why maven-bundle-plugin (thereby also bnd), declares it inside the entry "Require-Capability"?
- If I need to install it on the OSGi framework, where may I find it?
Some additional information:
- karaf version: 4.0.7;
- maven bundle plugin: 3.2.0;
- OS: Windows 10 64bit;
- IDE: Eclipse Neon;
Some code to provide additional info:
The whole error:
Error executing command: Error executing command on bundles: Error starting bundle 96: Unable to resolve com.massimobono.karaf.examples.user-fully-rest [96](R 96.0): missing requirement [com.massimobono.karaf.examples.user-fully-rest [96](R 96.0)] osgi.extender; (&(osgi.extender=osgi.component)(version>=1.3.0)(!(version>=2.0.0))) Unresolved requirements: [[com.massimobono.karaf.examples.user-fully-rest [96](R 96.0)] osgi.extender; (&(osgi.extender=osgi.component)(version>=1.3.0)(!(version>=2.0.0)))]
Manifest file:
Manifest-Version: 1.0
Bundle-SymbolicName: com.massimobono.karaf.examples.user-fully-rest
Archiver-Version: Plexus Archiver
Built-By: massi
Bnd-LastModified: 1479908575162
Bundle-ActivationPolicy: lazy
Bundle-ManifestVersion: 2
Import-Package: com.massimobono.karaf.examples.user;version="[0.0,1)",
com.massimobono.karaf.examples.user.service;version="[0.0,1)",javax.w
s.rs;version="[2.0,3)",javax.ws.rs.core;version="[2.0,3)"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo
nent)(version>=1.3.0)(!(version>=2.0.0)))",osgi.service;filter:="(obj
ectClass=com.massimobono.karaf.examples.user.service.UserService)";ef
fective:=active,osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.massimobono.karaf.examples.user.ui.ful
lyrest.UserRest.xml
Tool: Bnd-3.2.0.201605172007
Originally-Created-By: Maven Integration for Eclipse
Export-Package: com.massimobono.karaf.examples.user.ui.fullyrest;uses:
="javax.ws.rs,javax.ws.rs.core";version="0.0.1"
Bundle-Name: user-fully-rest Maven Webapp
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Build-Jdk: 1.8.0_91
Rest base class:
package com.massimobono.karaf.examples.user.ui.fullyrest;
import java.time.LocalDateTime;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import com.massimobono.karaf.examples.user.User;
import com.massimobono.karaf.examples.user.service.UserService;
import com.massimobono.karaf.examples.user.service.UserServiceException;
@Path("user")
@Component(immediate=true)
public class UserRest {
@Reference
private volatile UserService userService;
@GET
@Produces(MediaType.TEXT_HTML)
public String getUserNumber() {
try {
return String.format("<h1>Total users: %d</h1>", this.userService.size());
} catch (UserServiceException e) {
return String.format("Couldn't fetch total users because %s", e.getMessage());
}
}
@PUT
@Path("add/{name}/{surname}")
@Produces(MediaType.TEXT_HTML)
public String add(@PathParam("name") String name, @PathParam("surname") String surname) {
try {
User u = new User(name, surname, LocalDateTime.now());
this.userService.addUser(u);
return String.format("<h1>New user with id %d</h1>", u.getId());
} catch (UserServiceException e) {
return String.format("<h1>Couldn't fethc total users because %s</h1>", e.getMessage());
}
}
@DELETE
@Path("remove/{id}")
@Produces(MediaType.TEXT_HTML)
public String remove(@PathParam("id") int id) {
User u;
try {
u = this.userService.getUser(id);
this.userService.removeUser(u);
return String.format("<h1>User name=%s surname=%s removed correctly</h1>", u.getName(), u.getSurname());
} catch (UserServiceException e) {
return String.format("<h1>Couldn't remove user because %s</h1>", e.getMessage());
}
}
}
Thanks for any kind reply
回答1:
How can I solve this issue?
Most likely you are missing SCR in your Karaf runtime. You can install it with feature:install scr
What is osgi.component bundle? Why is needed?
It's not a bundle but a requirement. Basically it says your bundle needs SCR (or something) that knows how to process and register the components defined in it via Declarative Services.
Why maven-bundle-plugin (thereby also bnd), declares it inside the entry "Require-Capability"?
Because it sees that you are using Declarative Services and knows they will not work unless you have something at runtime that understands how they are declared and knows how to manage their lifecycle. If the requirement was not there (which I believe was the case with earlier versions of bnd) then your bundle would start without issues but services would still be not registered / activated.
If I need to install it on the OSGi framework, where may I find it?
In Karaf it's available as feature (see the answer to your first question). In plain OSGi runtime (Felix, Equinox, ...) you need to install it manually. It's available in Maven central.
来源:https://stackoverflow.com/questions/40790543/unresolved-requirement-osgi-component