OSGi enRoute – 2.3_7 – Dependencies

在本章中你将学到什么?

在本章中我们将会将之前那个非常简单的解析器替换成Maven Central库中的一个外部依赖项。这个依赖项是Parsii,它是一个非常轻量的表达式解析器。

20180401_102

确认你位于顶层文件夹中:

创建工程

在osgi.enroute.examples.eval文件夹中的 parsii.provider文件夹中,为osgi.enroute.examples.parsii.provider创建一个新的工程,pom.xml文件应该如下所示:

 

这个与我们之前提供的简单Provider很像,不过现在多了一个外部依赖项Parsii Parser。

源码

我们可以使用如下源码:

日志服务的引用没有被用到。添加这行的目的是为了解决bnd中的一个bug,它很快会被修复。问题在于对于一个非常简单的DS,依赖项osgi.extender没有被包含进来。

Bundle的布局

这里的bnd.bnd文件比我们以前创建的要稍微复杂一些。原因在于我们添加的依赖项不是一个Bundle,因此我们不能在运行时依赖这个JAR。在本例中,需要使用两种不同的方法。你可以封装(wrap)或包含(include)这个Bundle。对一个Bundle进行wrap意味着创建一个新的工程并提供OSGi元数据。Include对应的JAR则意味着通过bnd的Private-Package指令从JAR中将所需的包都Include进来,

在本例中我们选择了后者,因此bnd.bnd文件将会如下所示:

 

与在simple provider中一样,我们已经export了API。不过,与在simple provider中我们默认使用工程中所有的类不同,在这里我们精确列出了希望使用的包。

在build过程中,Maven不会自动清理classes文件夹。这意味着只有在执行了mvn clean命令之后,你才可以确保内容的正确性。在实际情况中,在该文件夹下一般会存放着长期实验过程中产生的类文件和bnd.bnd文件。

构建

再次提醒下,不要忘记在parent pom文件中添加parsii.provider的module信息。

现在我们来构建对应的bundle:

在信息中显示出了bnd添加的Private-Package header,它清晰地显示出我们已经添加了在bundle中找到的parsii包。我们在bnd.bnd文件中为Private-Packages指定了一个通配符,但是在manifest中我们可以清晰地看到在类路径中的包是parsii.tokenizer 和 parsii.eval。

运行

我们现在应该切换到bndrun工程中。

我们首先需要在此工程中的pom.xml中将simple provider替换为新的eval parser,使得它可以被解析器使用到。因此dependencies元素应该看起来如下所示:

在bndrun工程中的osgi.enroute.examples.eval.bndrun文件中,我们需要修改-runrequires,使用parsii.provider来替代simple provider:

然后进行解析,看起来应该如下所示

然后使用返回的 -runbundles信息来更新osgi.enroute.examples.eval.bndrun 文件,然后再次运行mvn install。

然后我们可以运行应用程序:

在本章中我们学到了什么?

我们创建了一个新的provider,它使用了一个外部dependency。我们需要将这个dependency中的代码包含到我们的新bundle之中,因为Parsii JAR中没有OSGi元数据。然后我们将这个新的工程添加到了module信息之中并更新了bndrun工程,其中使用了新的Parsii provider。

然后它们正常工作了!

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2018/04/osgi-enroute-0203_7/
百度已收录