0

ファクトリ メソッドを使用して実装を返す必要があるため、Apache Felix Dependency Manager によってインスタンス化されたサービスがあります。

manager.add(
    manager.createComponent()
    .setInterface(aServiceName, new Properties())
    .setFactory(factory, "create"));

このサービスを同じバンドル内のサービスに挿入したいので、aService と bService の両方を同じバンドルに含める必要があります

@Component
public class BService {

    @Reference
    private AService aService;

    [...]
}

これは完全に正常に機能しています。問題は、プライベート サービスのように aService をバンドルの外に表示したくないということです。私が削除した場合:

.setInterface(aServiceName, new Properties())

とにかく作成されたように見えるコンポーネントは作成されておらず、サービスとして登録されていないため、他のバンドルでは使用できませんが、DS アノテーションを使用してコンポーネントを挿入することはできません。サービスを元のバンドル内でのみ表示することは本当に不可能ですか? または、DS アノテーションを使用してコンポーネントを挿入する方法はありますか?

コンポーネントを注入するために Apache Felix Dependency Manager を使用してみました。

import org.apache.felix.dm.annotation.api.Component;
import org.apache.felix.dm.annotation.api.ServiceDependency;

@Component
public class BService {

    @ServiceDependency
    private AService aService;

    [...]
}

しかし、コンポーネントが注入されていないことがわかりました:

[32] org.apache.felix.dependencymanager.runtime
 [0] org.apache.felix.dm.runtime.DependencyManagerRuntime registered
     active (DependencyManager-Component=*) bundle optional available
     org.osgi.service.packageadmin.PackageAdmin service required available
     org.osgi.service.log.LogService service optional available
[131] [...]
  [7] [...].BService unregistered
      org.osgi.service.log.LoggerFactory service required available
      [...].AService service required unavailable

これは、単純なコンポーネントを @ServiceDependency で注入できないことを意味しますか?それらはサービスであり、OSGI レジストリにある必要があるためですか? では、アノテーションを使用して単純なコンポーネントを挿入するにはどうすればよいでしょうか? あるはずですよね?

アップデート

aService の実装ではパッケージをエクスポートする必要があることに気付きました。したがって、これは単なる設計上の欠陥でした。次に、サービスを 2 つの異なるバンドル (OSGI の方法) に分離する方法を見つけ、問題を解決しました。

それを行う前に、エクスポートされたバンドルからパッケージを削除しようとしましたが、それでも機能しませんでした.サービスは引き続き利用可能でした.

Export-Package: [...].services;version="0.0.1"
Provide-Capability: osgi.service;uses:="[...].services";o
 bjectClass="[...].services.BService",osgi.service;uses:=
 "[...].services.internal";objectClass="[...].services.internal.AService"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo
nent)(version>=1.4.0)(!(version>=2.0.0)))",osgi.service;effective:=ac
tive;filter:="(objectClass=[...].services.internal.AServ
ice)"
4

2 に答える 2