我不知道我正在做的是否是 OSGi 和 Maven 方式,所以首先介绍一些背景:
我有两个 bundle web
和client
。在客户端 bundle 中,我想访问 Web bundle 注册的服务。我已经检查过我可以实现 BundleContextAware
在客户端 bundle 中,并且如果 Web bundle 的 ArtifactId 为 project.web
然后进行以下工作:
public void setBundleContext(BundleContext bc) {
bc.getServiceReferences(clazz, "(Bundle-SymbolicName=project.web)")
我想要的不是硬编码网络包的符号名称。符号名称来自artifactId
在 pom.xml
中声明,我相信有一些双子座蓝图魔法。所以我目前的想法是
- 创建属性
web.artifactId
在父pom中 - 在 web 包的 pom 中使用
<artifactId>${web.artifactId}</artifactId>
- 以某种方式访问客户端 bundle 的
BundleContextAware.setBundleContext
中的该属性
我该如何完成最后一步?我想可能可以在运行时生成一个 java 文件,将属性值分配给某个已知的标识符,因此我可以使用 WebBundleInfo.ARTIFACT_ID
;但我不知道该怎么做,并且想知道这是否太过分了。
另一个想法是客户端 bundle 是否可以使用System.getProperty
访问这个值?我看到了一些关于访问属性文件的引用,但我不太热衷于它——既不热衷于读取属性文件,也不热衷于生成它。
所以我的问题是: - 这是共享包的符号名称的好方法吗? - 是否有办法自动使 pom 文件中创建的某些属性可用于运行时执行环境? - 我想我可以弄清楚如何生成这样的源文件,但这是解决这个问题的好方法吗?有没有办法在没有源文件的情况下生成这样的文件,即从 pom.xml 本身中的某些文本生成?此外,是否可以仅在现有文件发生更改时才覆盖现有文件,以避免重新编译,因为每次编译后都会产生新的快照版本?
最佳答案
在编译时设置变量的最简单方法是确保它们最终出现在包的 list 中。就像你说的,Bundle-SymbolicName 已经这样做了。对于客户端 bundle ,您可能应该创建一个包含变量的新的自定义 header 。然后,从您的客户端 bundle 中,您可以执行以下操作:
public void setBundleContext(BundleContext bc) {
String filter = (String) bc.getBundle().getHeaders().get("MyCustomHeader");
bc.getServiceReferences(clazz, filter);
}
话虽这么说,您能否更多地解释一下您想要做什么(在更高的级别),因为我不明白为什么您不只是使用 OSGi 服务和依赖项(使用声明性服务、蓝图、或者其他一些依赖注入(inject)框架)?
关于java - 在运行时访问 OSGi 包中的 pom 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17031431/