Hello again. Well, it's really clear now. I have a command that "almost" works : I don't understand why when I start a fresh installed karaf and deploy my features, the reference that is used by the command is not the right one. This is a map that is created in a blueprint for camel routes, and I'm sure that it contains entries when commands are executed, but the referenced map is empty.
In the blueprint : <bean id="dlqRoutesTable" class="java.util.concurrent.ConcurrentHashMap" /> <service interface="java.util.Map" ref="dlqRoutesTable" /> In the command : @Reference(filter = "(osgi.blueprint.compname=\"dlqRoutesTable\")") Map<String, String> routesTable; Both are in the same bundle, in a unique feature. After stop/starting, or updating the bundle, it works. The same if I shutdown and restart Karaf. It seems that the reference is wrong (empty and not null) only at the first deployment. Any ideas ? Could it be a Karaf bug ? I have many beans and services in or across bundles, and no issue like that. This case is the first and unique use of the karaf @Reference... Thanks again. Le ven. 18 avr. 2025 à 11:36, João Assunção <[email protected]> a écrit : > Hi again. > All my bundles that have commands don't include any classes from karaf. > Maybe the instructions you have in the apache maven bundle plugin are > importing additional stuff? > You can find in here an example of a karaf command with the pom used to > build it: > https://github.com/jassuncao/osgi-utils/tree/master/config-extras > > Regards, > João > > On Fri, Apr 18, 2025 at 7:28 AM Ephemeris Lappis < > [email protected]> wrote: > >> Hello again. >> >> I see that the karaf plugin adds the manifest entry with the package that >> contains my command, but also generates and adds classes as you can see in >> the screenshot. >> >> [image: image.png] >> Do you mean that this is not needed for shell commands processing at >> runtime ? >> Thanks again. >> Regards. >> >> Le ven. 18 avr. 2025 à 01:04, Matt Pavlovich <[email protected]> a >> écrit : >> >>> I only add the Karaf-Commands instruction using the bundle plugin >>> >>> On Apr 17, 2025, at 5:14 PM, Ephemeris Lappis < >>> [email protected]> wrote: >>> >>> Hello João and Matt. >>> >>> >>> Indeed, after taking a closer look at the custom command example >>> command, it seems simpler to use the Karaf API than the OSGi API and SCR. >>> Since my last post, I've successfully built and deployed a simple command >>> using the "karaf-services-maven-plugin" to generate the additional entries >>> in the bundle manifest. However, I had to add an "execution" to the plugin, >>> whereas the example doesn't, because without it, the plugin isn't triggered >>> at the expected maven phase. I see that you directly add "Karaf-Commands:*" >>> to the bundle build configuration. Is this sufficient, and is it a good >>> practice ? >>> >>> In any case, there's no need to add any additional features like SCR to >>> mine. >>> >>> Thank you very much. >>> >>> >>> Ephemeris Lappis >>> >>> Le 17/04/2025 à 18:52, João Assunção a écrit : >>> >>> I checked, and the annotations package are not required during runtime. >>> If I use the headers command to list the packages required by a bundle >>> where SCR components are used, the package >>> "org.osgi.service.component.annotations" is not required. >>> In the previous email I forgot to mention that I install the scr feature. >>> For karaf shell commands, I don't use SCR. I use Karaf's API for >>> commands. >>> Follow a simple command using a service provided by an SCR component. >>> For the command to be recognized by Karaf it is necessary to include a >>> header "Karaf-Commands:*"in the bundle manifest. I use bnd-maven-plugin to >>> build my bundles >>> >>> import org.apache.karaf.shell.api.action.Action; >>>> import org.apache.karaf.shell.api.action.Argument; >>>> import org.apache.karaf.shell.api.action.Command; >>>> import org.apache.karaf.shell.api.action.lifecycle.Reference; >>>> import org.apache.karaf.shell.api.action.lifecycle.Service; >>>> >>>> import com.atobe.ort.photo.repository.PhotoRepositoryService; >>>> >>>> @Command(scope = "photorepo", name = "purge", description = "Purge") >>>> @Service >>>> public class PurgeCommand implements Action { >>>> >>>> @Reference >>>> PhotoRepositoryService repositoryService; >>>> >>>> @Argument(index = 0, name = "days", description = "Days", >>>> multiValued = false, required = true) >>>> Integer days; >>>> >>>> @Override >>>> public Object execute() throws Exception { >>>> >>>> Duration age = Duration.ofDays(days); >>>> repositoryService.purgePhotos(age); >>>> return null; >>>> } >>>> >>>> } >>> >>> >>> The corresponding "bnd.bnd" file: >>> >>>> Bundle-Name: ${project.name} >>>> Bundle-Description: ${project.description} >>>> Karaf-Commands:* >>> >>> >>> >>> Best regards, >>> João >>> >>> >>> >>> On Thu, Apr 17, 2025 at 4:41 PM Ephemeris Lappis < >>> [email protected]> wrote: >>> >>>> Hello João ! >>>> >>>> First, thanks for your answer. >>>> >>>> I see your dependency as "provided", so I suppose that you assume that >>>> classes are exported by some bundle. In my case I didn't find any standard >>>> feature with a bundle that exports the required annotations packages. What >>>> did you do to get them at runtime ? >>>> >>>> As I aim to provide custom shell commands, I'd initially prefer to use >>>> a basic OSGi design, and using annotations, and. with the SCR files being >>>> generated by the bundle plugin. >>>> >>>> An alternate solution could be using Karaf packages, as described in >>>> these examples ( >>>> https://github.com/apache/karaf/blob/main/examples/karaf-command-example/karaf-command-example-command/src/main/java/org/apache/karaf/examples/command/command/AddCommand.java >>>> ). >>>> >>>> But this also fails : my custom command is not correctly detected and >>>> installed. >>>> >>>> An idea of the best way to do that ? >>>> >>>> Thanks again. >>>> >>>> Regards. >>>> >>>> Le jeu. 17 avr. 2025 à 13:47, João Assunção < >>>> [email protected]> a écrit : >>>> >>>>> Hi, >>>>> I'm almost sure the annotations are not needed during execution. >>>>> During runtime, SCR uses the XML files included inside the bundle (jar). >>>>> The bundle plugin uses the annotation in the classes to generate those >>>>> xml descriptors. >>>>> In my maven projects, I normally use the "bom" dependency provided by >>>>> karaf to ensure I'm using the same dependencies used by Karaf. For >>>>> example: >>>>> >>>>>> <dependency> >>>>>> <groupId>org.apache.karaf</groupId> >>>>>> <artifactId>karaf-bom</artifactId> >>>>>> <version>${karaf.version}</version> >>>>>> <type>pom</type> >>>>>> <scope>import</scope> >>>>>> </dependency> >>>>> >>>>> >>>>> But for my convenience, I tend to use the Enroute dependency: >>>>> <dependency> >>>>> <groupId>org.osgi.enroute</groupId> >>>>> <artifactId>osgi-api</artifactId> >>>>> <version>7.0.0</version> >>>>> <type>pom</type> >>>>> <scope>provided</scope> >>>>> >>>>>> </dependency> >>>>> >>>>> >>>>> Best regards, >>>>> João >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> On Thu, Apr 17, 2025 at 11:50 AM Ephemeris Lappis < >>>>> [email protected]> wrote: >>>>> >>>>>> Hello. >>>>>> >>>>>> I can't find if a Karaf feature exists to provide the annotations for >>>>>> SCR, such as Service, Reference, etc. >>>>>> >>>>>> Installing the feature "scr" just adds bundles to manage the runtime, >>>>>> not the annotations. >>>>>> >>>>>> Perhaps the packages are provided by a Compendium bundle. >>>>>> >>>>>> Is there a provided feature that includes them, or do we have to add >>>>>> explicitly bundles for that ? In this case, what is the right version to >>>>>> match the OSGi framework of Karaf 4.4.x ? >>>>>> >>>>>> Thanks for your help. >>>>>> >>>>>> Regards. >>>>>> >>>>> >>> >>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> >>> Sans >>> virus.www.avast.com >>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> >>> >>> >>>
