【问题标题】:Access a pom property in OSGi bundle at run time在运行时访问 OSGi 包中的 pom 属性
【发布时间】:2023-03-06 13:14:01
【问题描述】:

我不知道我做的是不是OSGi和Maven的方式,所以先来点背景:

我有两个捆绑包webclient。在客户端包中,我想访问 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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这似乎是我正在寻找的。如何在捆绑清单中得到一些东西?容器中有许多包,我希望在 Web 和客户端包之间签订合同,并让客户端包获取对 Web 包注册的服务的引用。在客户端包中的 java 代码中,我不想硬编码 Web 包的符号名称。
    • 假设您使用的是 Apache Felix“maven-bundle-plugin”,您可以将自定义标头添加到 pom.xml 中的说明中:(someKey=someValue)
    • 完美。我在 web bundle 中使用了<artifactId>${web.artifactId}</artifactId>,在 maven-bundle-plugin 指令中使用了<Web-ArtifactId>${web.artifactId}</Web-ArtifactId>。如果按名称访问其他捆绑包是一件坏事,您能否发表评论?
    • 捆绑包有一个符号名称来唯一标识它们。但总的来说,在 OSGi 中,直接依赖特定的包(或它们的名称)被认为是不好的做法。这会在两个捆绑包之间创建直接耦合,并且不允许您轻松地将一个捆绑包替换为另一个捆绑包(同时也不会更改使用者本身)。因此,如果您可以防止这种情况发生,那就太好了。您知道您还可以发布具有某些属性的服务,并且您可以再次使用这些属性来选择一个服务,如果有多个实现相同的接口。
    • 我隐约知道,但没有意识到我可以使用它。感谢您的建议。
    猜你喜欢
    • 2012-03-31
    • 2012-07-15
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多