OSGi enRoute – 2.2_10 – 部署应用程序

在本节中你将学到什么

通过我们之前所做的工作已经获得了一个能工作的Provider!然而,我们还仅仅将其运行在了一个评估和测试的模式之中。在本节中,我们将看看如何将这个Provider Bundle用到一个可以部署的应用程序之中。

在Java(和OSGi)中有很多种部署格式:WAR文件、Karaf KAR、EAR文件、OSGi SubSystem、OSGi Deployment Admin等。通过使用插件Bndtools可以支持所有的类型,但原生支持的是最常见的部署格式:一个可执行的JAR。一个可执行的JAR没有额外的依赖,所有未包含在JDK中的依赖项都已嵌入到该jar中了。

可执行的JAR的优雅之处在于它可以在任何安装了Java虚拟机的地方启动:

创建一个应用程序

我们要做的第一件事就是创建一个bndrun文件。不要把bndrun文件与bnd.bnd文件中的Run选项卡搞混。这是俩不同的文件。Bndrun文件允许我们为我们的框架指定一个运行时环境。

因此使用New/Bndtools/Bnd OSGi Project菜单并且使用com.acme.prime.eval.application 作为工程名。这个工程的.application扩展名会使得我们创建一个应用程序工程。不要忘记了使用OSGi enRoute模板!

一个应用程序工程应该不包含(或者非常少)代码,但是它应该作为入口。在其中包含了驱动最终应用程序的需求(Requirements)。

唯一的内容

在默认情况下,一个应用程序仅包含一个Gogo shell命令行,例如本例中的EvalApplication类。这个类与EvalImple类非常类似,但又有些不同。在EvalImpl类中我们仅仅创建了对已有API的调用,eval可以作为一个Gogo命令来使用。在这个应用程序工程中,我们需要获得服务并且调用服务中的方法。使用DS可以非常方便地获取服务,只需要增加一个setter方法并且添加@Reference注解。因此使用下面的代码来替代EvalApplication 的代码:

这段代码注册了一个假的Service,它向Gogo shell提供了eval:eval命令(注意它与我们在Provider中创建的test:eval命令的差别)

与test工程类似,我们需要增加一个对API工程的依赖。与之前类似,进入bnd.bnd文件的Build选项卡,然后增加 com.acme.prime.eval.api工程。

定义应用程序

我们将会在bndrun文件中定义运行时(Runtime)的Requirements,这是一个特殊的文件。该文件已经被放置到了应用程序工程之中:com.acme.prime.eval.bndrun。这样的一个bndrun文件中主要是我们之前在bnd.bnd文件的Run选项卡中进行处理的信息。如果你双击该文件,则它看起来如图所示:

20171217_201

如你所见,我们的Gogo命令所需的初始Requirements已经在里面了。在我们进行试用之前,先增加一个shell(org.apche.felix.gogo.shell)来使其更便于交互。就是这样!点击Resolve按钮并保存bndrun文件。

20171217_202

在bndrun的Run选项卡的右上角有几个按钮:

20171217_202_2

如果你点击Debug OSGi按钮,则bnd会启动一个框架并运行你的应用程序。

由于我们有一个shell,因此我们可以尝试使用命令:

调试

让我们首先停止这个框架,以便我们启动另外一个对于调试来说更为友好的框架。单击Eclipse控制台上的红色按钮即可停止。

应用程序工程还包含了一个debug.bndrun文件。这也是一个bndrun文件,但是它添加了调试所需的内容。因此退出运行中的框架(进入控制台,然后点击红色按钮)并双击debug.bndrun文件,解析并点击Debug OSGi按钮。

你将注意到的第一样东西会是满屏红色文字的控制台。这是启动器的跟踪输出记录。如果事情并未按照你所期望的方式发展(希望它永远不会发生),那么这些输出内容将会帮助你解决问题,它们会跟踪安装过程的细节。这种行为可以通过-runtrace标志进行触发。点击bnd.bnd文件的Source选项卡,如果你不希望进行跟踪则可将这个标志改为false或者删除该标志。

20171217_203

debug.bndrun 文件是从com.acme.prime.eval.bndrun 文件继承而来,任何添加到此文件中的初始Requirements都会自动地添加到debug.bndrun文件中;第一条准则是不要重复你自己(Don’t Repeat Yourself,DRY)。然而,在debug.bndrun中增加了一些标准Requirements,它们会使得调试OSGi应用程序变得更为简单。它增加了Web控制台、Gogo shell等。因此点击Debug OSGi按钮,然后进入http://localhost:8080/system/console/xray来检查你的OSGi系统。用户名和密码都是admin。

20171217_204

XRay及其相关的工具我们在《调试( debug section)》章节中已经进行了解释。

导出(Export

Export最令人开心,OK,至少感觉不会太坏。但是我们如何来部署呢?如何使得它们在我们的目标环境中运行起来?好的,我们可以将它们放到一个由可执行JAR文件构成的应用程序之中。

首先,我们双击com.acme.prime.eval.bndrun 文件并且选择Run选项卡。记住我们是在哪里找到 Debug OSGi按钮的,它在bndrun文件的Run选项卡的右上角。在它的右边一点你会找到Export按钮。

20171217_204_2

点击Export按钮会向你展示一个对话框,它会询问你将可执行JAR文件存放到文件系统的什么位置:

20171217_205

选择Executeable JAR,然后保存到你的桌面,使用 com.acme.prime.jar作为名称。

20171217_206

这个JAR文件非常有意思:它没有任何外部依赖。要执行它,你需要在桌面上打开一个shell:

这世上还有更多有意思的事情吗?它有没有让你觉得惊奇能算出这么复杂的算式?

总之,当你算够了之后,你可以通过Control+C来退出这个应用程序。

它是如何工作的?

bndrun文件定义了期望的Runtime中的Requirements。当点击Resolve按钮时,bnd resolver会扫描初始的Requirements,并且将会尝试在资源库中查找满足这些Requirements的资源,以及这些资源所需的Requirements。查找结果中的Bundle集合定义了一个Runtime,这些bundle将会在-runbundles指令中进行设置。

一个Runtime环境然后会被执行来校验这些设置,这可能会需要进行一些修改。如果校验的结果无误,则bnd的export功能将会被使用。

Bnd export通过一个插件来进行;该插件同时也是管理运行的插件,在本例中是默认的aQute.launch插件。该插件启动了Runtime环境并且创建了一个包含所有依赖的JAR,其中包括其自身以及所有的属性;它创建了一个完全自包含(self contained)的JAR。

 

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