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>
>>>
>>>
>>>

Reply via email to