【发布时间】:2023-03-06 13:14:01
【问题描述】:
我不知道我做的是不是OSGi和Maven的方式,所以先来点背景:
我有两个捆绑包web 和client。在客户端包中,我想访问 Web 包注册的服务。我已经检查过我可以在客户端包中实现BundleContextAware,如果网络包的 ArtifactId 是project.web,那么以下工作:
public void setBundleContext(BundleContext bc) {
bc.getServiceReferences(clazz, "(Bundle-SymbolicName=project.web)")
我想要的不是硬编码 web 包的符号名称。符号名称来自pom.xml 中声明的artifactId,我相信这是一些双子座蓝图魔术。所以我现在的想法是
- 在父 pom 中创建属性
web.artifactId - 在 web bundle 的 pom 中使用
<artifactId>${web.artifactId}</artifactId> - 以某种方式访问客户端捆绑包的
BundleContextAware.setBundleContext中的该属性
我该如何做这最后一步?我想有可能在运行时生成一个java文件,将属性值分配给某个已知的标识符,所以我可以使用WebBundleInfo.ARTIFACT_ID;但我不知道该怎么做,我想知道这是否有点矫枉过正。
另一个想法是客户端捆绑包是否可以使用System.getProperty 访问此值?我看到了一些关于访问属性文件的参考资料,但我不是很喜欢它——既不喜欢读取属性文件,也不喜欢生成它。
所以我的问题是: - 这是像这样共享捆绑包的符号名称的好方法吗? - 是否可以自动使 pom 文件中创建的某些属性可用于运行时执行环境? - 我想我可以弄清楚如何生成这样的源文件,但这是解决这个问题的好方法吗?有没有办法在没有源文件的情况下生成这样的文件,即从 pom.xml 本身的一些文本?此外,是否可以仅在现有文件发生更改时才覆盖现有文件以避免重新编译,因为每次编译后都会以新的快照版本结束?
【问题讨论】:
标签: java maven osgi equinox blueprint-osgi