0

我不知道我正在做的是否是 OSGi 和 Maven 方式,所以先来一些背景知识:

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

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

我想要的不是硬编码 web 包的符号名称。符号名称来自artifactId声明的 in pom.xml,我相信是通过一些双子蓝图魔法。所以我现在的想法是

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

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

另一个想法是客户端捆绑包是否可以使用System.getProperty访问​​此值?我看到了一些关于访问属性文件的引用,但我不是很热衷于它——既不是读取属性文件,也不是生成它。

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

4

1 回答 1

2

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

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

话虽如此,您能否解释一下您正在尝试做什么(在更高级别),因为我不明白为什么您不只是使用 OSGi 服务和依赖项(使用声明式服务、蓝图或其他一些依赖注入框架)?

于 2013-06-10T20:21:10.270 回答