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

Java 在运行时访问OSGi包中的pom属性,java,maven,osgi,equinox,blueprint-osgi,Java,Maven,Osgi,Equinox,Blueprint Osgi,我不知道我所做的是否是OSGi和Maven方式,因此首先了解一些背景: 我有两个包web和client。在客户端包中,我想访问web包注册的服务。我已经检查了我是否可以在客户端捆绑包中实现BundleContextAware,如果web捆绑包的ArtifactId是project.web,则以下操作有效: public void setBundleContext(BundleContext bc) { bc.getServiceReferences(clazz, "(Bundle-Sym

我不知道我所做的是否是OSGi和Maven方式,因此首先了解一些背景:

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

public void setBundleContext(BundleContext bc) {
    bc.getServiceReferences(clazz, "(Bundle-SymbolicName=project.web)")
我不想硬编码web包的符号名称。这个符号名来自于
pom.xml
中声明的
artifactId,我相信这是双子座蓝图的魔力。所以我现在的想法是

  • 在父pom中创建属性
    web.artifactId
  • 在web包的pom中使用
    ${web.artifactId}
  • 以某种方式访问客户端捆绑包的
    BundleContextAware.setBundleContext
最后一步该怎么做?我想可能会在运行时生成一个java文件,将属性值分配给某个已知标识符,这样我就可以使用
WebBundleInfo.ARTIFACT_ID
;但我不知道如何做到这一点,我想知道这是否是一种过度的杀伤力

另一个想法是,是否有一种方法可以让客户端包使用
System.getProperty
访问此值?我看到了一些关于访问属性文件的引用,但我对它不是很感兴趣——既不是读取属性文件,也不是生成属性文件

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

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

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

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

这似乎就是我要找的。我如何在捆绑清单中找到一些东西?容器中有很多bundle,我希望web和客户端bundle之间有一个契约,并让客户端bundle获得对web bundle注册的服务的引用。在客户端捆绑包中的java代码中,我不想硬编码web捆绑包的符号名称。假设您使用的是Apache Felix“maven捆绑包插件”,您可以将自定义头添加到pom.xml中的说明中:(someKey=someValue)完美。我在web捆绑包中使用了
${web.artifactId}
,在maven捆绑包插件说明中使用了
${web.artifactId}
。如果通过名称访问其他捆绑包是件坏事,请您发表意见。捆绑包有一个唯一标识它们的符号名称。但是,在OSGi中,通常认为直接依赖特定的bundle(或它们的名称)是不好的做法。这会在两个捆绑包之间创建直接耦合,并且不允许您轻松地用一个捆绑包替换另一个捆绑包(同时也不会更改使用者本身)。所以,如果你能阻止这一切,那就好了。您知道,您还可以发布具有某些属性的服务,并且如果有多个服务实现同一接口,您可以再次使用这些属性来选择服务。我模糊地知道,但没有意识到我可以使用这些属性。谢谢你的建议。