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

标签 java maven osgi equinox blueprint-osgi

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

我有两个 bundle webclient 。在客户端 bundle 中,我想访问 Web bundle 注册的服务。我已经检查过我可以实现 BundleContextAware在客户端 bundle 中,并且如果 Web bundle 的 ArtifactId 为 project.web然后进行以下工作:

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

我想要的不是硬编码网络包的符号名称。符号名称来自artifactIdpom.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/

相关文章:

Java正则表达式匹配引用的数字

java - 缓冲图像 java : Number of color/alpha components should be 4 but length of bits array is 2

java - 从 eclipse 执行部署时部署 'incomplete' 与直接从 jboss 执行部署不同

java - xjc 或 jaxb2-maven-plugin 或 maven : weird behavior while compiling XSDs, 处理文件两次但名称已更改?

java - 如何在 CQ5/OSGi Bundle (Java) 中启用断言?

api - 读取 JAR 文件的内容(在运行时)?

java - 在 IntelliJ 2016 中找不到此 SDK 中的任何 Android 目标

android - 在 Maven 中创建配置文件

jpa - 在 OSGi 环境中,类路径和类加载器是如何设置的?

java - 如何构建具有依赖关系的 OSGi 服务并通过 DS 发布