在运行时访问OSGi包中的pom属性

时间:2013-06-10 19:35:45

标签: java maven osgi equinox blueprint-osgi

我不知道我在做什么是OSGi和Maven方式,所以首先是一些背景:

我有两个捆绑webclient。在客户端捆绑包中,我想访问Web捆绑包注册的服务。我已经检查过我可以在客户端软件包中实现BundleContextAware,如果Web软件包的ArtifactId是project.web,那么以下工作:

public void setBundleContext(BundleContext bc) {
    bc.getServiceReferences(clazz, "(Bundle-SymbolicName=project.web)")

我想要的不是硬编码Web包的符号名称。符号名称来自于artifactId中声明的pom.xml,我相信一些双子座蓝图魔法。所以我目前的想法是

  • 在父pom中创建一个属性web.artifactId
  • 在网络包的pom中使用<artifactId>${web.artifactId}</artifactId>
  • 以某种方式访问​​客户端软件包BundleContextAware.setBundleContext
  • 中的该属性

我最后一步该怎么办?我想有可能在运行时生成一个java文件,将属性值分配给某个已知的标识符,所以我可以使用WebBundleInfo.ARTIFACT_ID;但我不知道该怎么做,并想知道这是否有点矫枉过正。

另一个想法是,客户端捆绑包是否可以使用System.getProperty来访问此值?我看到了一些访问属性文件的引用,但我对它不是很敏感 - 既没有读取属性文件,也没有生成它。

所以我的问题是: - 这是一个分享这个包的符号名称的好方法吗? - 有没有自动使pom文件中创建的某些属性可用于运行时执行环境? - 我想我可以弄清楚如何生成这样的源文件,但这是解决这个问题的好方法吗?有没有办法在没有源文件的情况下生成这样的文件,即pom.xml本身的某些文本?此外,是否可以仅在已更改的情况下覆盖现有文件以避免重新编译,因为在每次编译后它将以新的快照版本结束?

1 个答案:

答案 0 :(得分:2)

在编译时设置变量的最简单方法是确保它们最终出现在bundle的清单中。就像你说的,Bundle-SymbolicName已经有了。对于客户端捆绑包,您应该创建一个包含变量的新自定义标头。然后,从您的客户端捆绑包中,您可以执行以下操作:

public void setBundleContext(BundleContext bc) {
  String filter = (String) bc.getBundle().getHeaders().get("MyCustomHeader");
  bc.getServiceReferences(clazz, filter);
}

话虽如此,你能否解释一下你正在尝试做什么(更高层次),因为我不明白你为什么不只是使用OSGi服务和依赖(使用Declarative Services,Blueprint,或其他一些依赖注入框架)?